[前の記事]« ネットワーク有効/無効をコマンドで確認する方法
[次の記事]リストファイルからのファイル削除で削除し残しが出る »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FOR .. IN ( ) DO..」索引へ
▲カテゴリー「遅延環境変数の展開」索引へ

forを利用したファイル比較でつまづいてます

1493.
for中のcopyについて
2006年11月03日(金) 00時26分
むらちゃめ
●DOS/Windowsのバージョン↓
Microsoft Windows [Version 5.2.3790]

どうも、こんにちわ。
最近、DOSに目覚めて色々試しているのですが、
forを利用したファイル比較で一部行き詰っております。

例えば、
比較先) c:D1102\a\b\c\abc.txt
比較元) c:D1101\a\b

この構成で、forの/rオプションを使用しbフォルダを起点にfcで比較していくと、
新規に追加されたabc.txtも差分ファイルと判断されるコードを書いてみました。
この後、差分ファイルと認識されたabc.txtを
別ディレクトリにコピーしたいのですが、
新たに作成されたcフォルダを含めてコピーするには
どうすれば良いかわかりません。

比較先) c:D1102\a\b\c\abc.txt
比較元) c:D1101\a\b
BAKUP ) e:bakup
   ↓
比較先) c:D1102\a\b\c\abc.txt
比較元) c:D1101\a\b
BAKUP ) e:bakup\c\abc.txt

というような形にもってきたいのですが、for中に扱えるパスは
完全修飾パスやファイル名だけしか使えないようなので
無理でしょうか?
1494.
Re:for中のcopyについて
2006年11月03日(金) 04時07分
むらちゃめ
すこし見えてきました。
差分見つけた時に、

set FILE=c:\D1102\a\b\c\abc.txt
set FILE=%FILE:c:\D1102\a\b\=%
copy %FILE% e:bakup

で、ディレクトリごとコピーできそうです。
さらに、%CD%や他のsetで設定した文字列を
置換対象にするには、

cmd /v:on
set FILE=c:\D1102\a\b\c\abc.txt
set FILE=%FILE:!CD!=%
copy %FILE% e:bakup

でいいでしょうか。

1495.
つまずきました
2006年11月04日(土) 22時00分
むらちゃめ
set RELESE=c:\D1102\a\b
set BASE=c:\D1102\a\b\c\abc.txt

cmd /v:on /c "@set file=%BASE% & set !file:%RELEASE%\=!"

copy file %BACKUP%

こんな感じでやってるんですが、
%RELEASE%を認識してくれません。

ヒントだけでも、どなたかお願いします。
1496.
Re:つまずきました
2006年11月05日(日) 02時23分
ラシャン
>set RELESE=c:\D1102\a\b
>set BASE=c:\D1102\a\b\c\abc.txt
>
>cmd /v:on /c "@set file=%BASE% & set !file:%RELEASE%\=!"
>
>copy file %BACKUP%
>
>こんな感じでやってるんですが、
>%RELEASE%を認識してくれません。
>
>ヒントだけでも、どなたかお願いします。

>set RELESE=c:\D1102\a\b
おそらく貼り付けてあるのは一部だと思うのですが
ぱっと見で「RELEASE」ではなく「RELESE」になっている
ところくらいでしょうか?
ちなみに%BACKUP%はどこかでセットされていますよね?

1497.
Re:つまずきました
2006年11月05日(日) 19時40分
otn
>set RELESE=c:\D1102\a\b
>set BASE=c:\D1102\a\b\c\abc.txt
>
>cmd /v:on /c "@set file=%BASE% & set !file:%RELEASE%\=!"
>
>copy file %BACKUP%
>
>こんな感じでやってるんですが、
>%RELEASE%を認識してくれません。

スペルミス・文字抜けを補正すると、
set RELEASE=c:\D1102\a\b
set BASE=c:\D1102\a\b\c\abc.txt
cmd /v:on /c "@set file=%BASE% & set BACKUP=!file:%RELEASE%\=!"
copy %file% %BACKUP%
でしょうが、fileやBACKUPへのセットはサブプロセスのcmdで実行されるので、そのcmdが終了した時点で消えてしまいます。
遅延展開を有効にするために setlocal enabledelayedexpansion を使わないとすると、

set RELEASE=c:\D1102\a\b
set BASE=c:\D1102\a\b\c\abc.txt
set file=%BASE%
cmd /v:on /c "echo set BACKUP=!file:%RELEASE%\=!" > tmp.bat
call tmp.bat
copy %file% %BACKUP%

1498.
Re:つまずきました
2006年11月06日(月) 01時46分
むらちゃめ
ラシャンさん、otnさん ありがとうございました。
これからは、あせらずよく推敲して投稿します。

現状、どうなっているかといいますとうまく動いていません。
無事、各変数に値が設定されるようになりましたが、置換部分がうまく動いていないようです。

>cmd /v:on /c "echo set BACKUP=!file:%RELEASE%\=!" > tmp.bat

ここの%RELEASE%が変な変換がされているようで、試しに

@echo off
set temp=this is a pen.
set dog=cat
echo %temp:pen=%dog%%
pause
で実行すると

this is a .dog%

と、なってしまいました。
直接、文字列を入力した場合は正常に動くので
どうやらSETの文法を読み違えていたみたいです。

今後も、よろしくお願いいたします。
1499.
Re:つまずきました
2006年11月06日(月) 02時10分
otn
>echo %temp:pen=%dog%%

これは、%temp:pen=% が一つ目の変数展開なので、%temp% の中の pen 削除という意味になります。
その後の dog は普通の文字列。
最後の %% は、バッチスクリプト中に % 1文字を書くときの記法です。
したがって、

>this is a .dog%

が正しい処理結果です。

1500.
Re:つまずきました
2006年11月06日(月) 05時18分
むらちゃめ
ありがとうございます。
この後、色々試してみてサブルーチンの引数渡しでうまく動くtmp.batに書き込みされる事を確認しました。
ですが、この後のcallで呼び出してもBACKUPの中身が空でした。

・・・また、私なんかやっちゃったかな。
1501.
動いた!
2006年11月06日(月) 20時56分
むらちゃめ
ようやく動作しました!

setlocal enabledelayedexpansionの使用と、
サブルーチンの引数(%1とか)を置換文字列に設定すると
驚く程あっさりと動いちゃいました。
色々、苦労しましたがようやく報われた思いです。
otnさん、どうもありがとうございました。
 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ
カテゴリー「遅延環境変数の展開」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2006年11月03日 14:21に投稿されたエントリーのページです。

ひとつ前の投稿は「ネットワーク有効/無効をコマンドで確認する方法」です。

次の投稿は「リストファイルからのファイル削除で削除し残しが出る」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート