- ベストアンサー
DOSバッチでフォルダ配下の全ファイルの一致確認
- DOSバッチを使用して、2つのフォルダ内のファイルの一致を確認する方法を探しています。
- 現在、一致確認のバッチファイルを作成中ですが、一時停止(pause)の部分で問題が発生しています。
- 一時停止(pause)の後に、list1.txtとlist2.txtのファイルから特定の文字列を削除して保存する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
バッチファイルでは、全ての文字を扱うのは無理です。 特殊文字ごとに特別対応が必要なケースもあります。 ! はsetlocal enabledelayedexpansionをやめる & はファイル名を引用符で囲む で、可能ですが、list1.txt list2.txtに記録されるファイル名が引用符込みになります。 % を含むファイル名は駄目ですね。 @echo off set x=C:\document\A\ set y=C:\document\B\ (for /f "delims=" %%F in ('dir /b /s /a-d %x%') do call :delx "%%F") > list1.txt (for /f "delims=" %%F in ('dir /b /s /a-d %y%') do call :dely "%%F") > list2.txt fc /n /w list1.txt list2.txt > huichi1.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。huichi1.txtを確認してください。" ) else ( set /p z="両者は完全に一致しました。" ) goto :EOF :delx set "F=%~1" call echo "%%F:%x%=%%" goto :EOF :dely set "F=%~1" call echo "%%F:%y%=%%" goto :EOF
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
> %%iから先頭と末尾に付いている " を取り除くにはどのように記述すればよいのでしょうか。 %%~i ですね。
お礼
なんとかできるようになりました。 ありがとうございました。 ---test3.bat--------------------------------- @echo off rem 以下の2行を実行前に書き換える(末尾に\をつけること) set x=C:\Document\A\ set y=C:\Document\B\ if exist list1.txt del list1.txt if exist list2.txt del list2.txt if exist huichi1.txt del huichi1.txt if exist huichi2.txt del huichi2.txt echo 比較リスト作成中です・・・ (for /f "delims=" %%F in ('dir /b /s /a-d %x%') do call :delx "%%F") > list1.txt (for /f "delims=" %%F in ('dir /b /s /a-d %y%') do call :dely "%%F") > list2.txt echo 比較実行中です・・・ fc /n list1.txt list2.txt > huichi1.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。huichi1.txtを確認してください。" goto :EOF ) else ( if exist huichi1.txt del huichi1.txt ) for /F "delims=" %%i in (list1.txt) do ( fc /b "%x%%%~i" "%y%%%~i" > nul if ERRORLEVEL 1 ( fc /b "%x%%%~i" "%y%%%~i" 2>&1 >> huichi2.txt ) ) if exist huichi2.txt ( set /p z="両者は一致しませんでした。huichi2.txtを確認してください。" ) else ( set /p z="両者は完全に一致しました。" ) goto :EOF :delx set "F=%~1" call echo "%%F:%x%=%%" goto :EOF :dely set "F=%~1" call echo "%%F:%y%=%%" goto :EOF ----------------------------------------------
- notnot
- ベストアンサー率47% (4900/10358)
ファイル名の先頭を削除してから比較する。 @echo off setlocal enabledelayedexpansion set x=C:\document\A\ set y=C:\document\B\ (for /f "delims=" %%F in ('dir /b /s /a-d %x%') do call :delx "%%F") > list1.txt (for /f "delims=" %%F in ('dir /b /s /a-d %y%') do call :dely "%%F") > list2.txt fc /n /w list1.txt list2.txt > huichi1.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。huichi1.txtを確認してください。" ) else ( set /p z="両者は完全に一致しました。" ) goto :EOF :delx set F=%~1 echo !F:%x%=! goto :EOF :dely set F=%~1 echo !F:%y%=! goto :EOF
お礼
回答ありがとうございます。 教えていただきましたサンプルコードを実行すると テストファイルでの比較は正しく行われましたが、 実際のデータで確認すると、あるところで 「・・・・は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして 認識されていません。」 というエラーで止まってしまいます。 いろいろ調べてみましたところ ファイル名またはフォルダ名に &が含まれているとうまくいかないようです。 また、元々のtest.batのコードでも、 ファイル名またはフォルダ名に !が含まれていると、 list1.txtとlist2.txtの出力時に !が空白に置き換わっていて fcコマンド実行時にファイルが存在しない というエラーになることも分かりました。 ファイル名またはフォルダ名に &や!が含まれていても 正しく比較することができる よい方法はないでしょうか。 よろしくお願いします。
お礼
回答ありがとうございます。 教えていただきましたコードで!や&があっても ファイルのフルパスが一致していることが 確認できるようになりました。 このあとファイルの中身が一致することを確認したいので 引用符を取り外したいのですが %%i から先頭と末尾に付いている " を取り除くには どのように記述すればよいのでしょうか。 下記のtest2.batのように %%i:"=%%" としてみたのですがうまくいきません。 よろしくお願いします。 ---test2.bat--------------------------- @echo off set x=C:\document\A\ set y=C:\document\B\ (for /f "delims=" %%F in ('dir /b /s /a-d %x%') do call :delx "%%F") > list1.txt (for /f "delims=" %%F in ('dir /b /s /a-d %y%') do call :dely "%%F") > list2.txt fc /n /w list1.txt list2.txt > huichi1.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。huichi1.txtを確認してください。" goto :EOF ) set err=0 if exist huichi2.txt del huichi2.txt for /F "delims=" %%i in (list1.txt) do ( fc /n /w "%x%%%i:"=%%" "%y%%%i:"=%%" >> huichi2.txt <---- ??? if ERRORLEVEL 1 ( set err=1 ) ) if %err%==0 ( set /p z="両者は完全に一致しました。" ) else ( set /p z="両者は一致しませんでした。huichi2.txtを確認してください。" ) goto :EOF :delx set "F=%~1" call echo "%%F:%x%=%%" goto :EOF :dely set "F=%~1" call echo "%%F:%y%=%%" goto :EOF ---------------------------------------