COMP = ファイルの内容を比較する。最後に質問あり版 - Windowsのコマンドプロンプト(bat,cmd) Windowsコマンド。ファイルとフォルダー関連 ＜▲＞ ○Windows XP 2つのファイルの内容を比較します。 FCコマンドよりも高速に比較します。そして最後に、他のファイルを比較するかどうか質問します。

私的メモでここにコピー

http://tounderlinedk.blogspot.com/2011/06/comp-windowsbatcmd.html
2011年6月9日木曜日

COMP = ファイルの内容を比較する。最後に質問あり版 - Windowsのコマンドプロンプト(bat,cmd)
Windowsコマンド。ファイルとフォルダー関連 ＜▲＞
○Windows XP
2つのファイルの内容を比較します。
FCコマンドよりも高速に比較します。そして最後に、他のファイルを比較するかどうか質問します。

o バイナリファイルとして比較します。（= テキストファイルを比較する事も可能です。）
o 大きなファイルの比較も高速です。10バイトの不一致で比較を終えるからです。
o 但し、最後に質問します。ですので、このコマンドは自動処理には向いていません。

o 2つのファイル名に同時にワイルドカード（「*」や「?」）を指定する時は、制限事項があります。FCコマンドと同じ制限です。


**** 書式
--------
comp [オプション] 比較したいファイル名 比較相手のファイル名
公式ヘルプの説明では
comp 比較したいファイル名 比較相手のファイル名 [オプション]
--------
o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
o オプション = 下記のオプションを、半角空白区切りで並べます。
    + 公式ヘルプの説明では、ファイル名の指定の後に置くとの事でした。
    + オプションを省略した時は、次のように動きます。
        + バイナリファイルとして比較します。
        + 不一致バイトがある場合は、10バイト分まで表示します。
COMP コマンドのオプション一覧
名前	意味
/d	不一致バイトの値を、10進数で表示します。
既定では、16進数（= 0-9,A-F）で表示します。
/a	不一致バイトの値を、文字で表示します。
ヘルプには「ASCII文字（= 半角の英数字や記号）」とありますが、全角文字も正しく表示されました。
/l
(= /L)	不一致バイトの位置を、行番号で表示します。
既定では、ファイル先頭からのオフセット（= バイト位置）を表示します。
/n=数字	ファイルの先頭から指定された行数分だけ比較します。
先頭行が1です。/n=1 と書いた時は、先頭行だけを比較します。
/c	英字の大文字と小文字を区別しません。
/off
または /offline	オフライン属性が設定されたファイルも比較します。
このオプションについては、to_dkでは動作確認していません。

o 比較したいファイル名 = このファイルに対して比較を行います。フォルダーを指定する事も出来ます。
    + ワイルドカード（「*」や「?」）を指定する事も出来ます。
    + 対応するファイルが「比較相手のファイル名」から見つからない時は、きっちりエラーになります。
o 比較相手のファイル名 = 指定方法は「比較したいファイル名」と同じです。
    + 両方のファイル名に対してワイルドカードを使う時、上手に比較出来ないパターンがありますので注意します。
    + 詳細は「FCコマンドで、ファイル名のワイルドカードが正しく動かないパターン」
--------
rem 成功するパターン
comp a*.txt b*.txt
comp c:\a\*.txt c:\b\*.txt

rem 失敗するパターン
comp *a.txt *b.txt
comp m*a.txt m*b.txt
--------
    + この他に、ワイルドカードを使って「比較したいファイル名」よりも多くのファイルを指定すると、余ったファイルを無視します。


**** 戻り値 ( ERRORLEVELの値。確認分のみ )
o 0 = ファイル内容の一致
    + 「ファイルに違いはありません」 = 2つのファイルの内容は一致しました。
    + 比較した全てのファイルが一致していた時に 0 になります。
    + 「比較したいファイル名」が不足している場合、エラーになりませんので気を付けます。
o 1 = ファイル内容に相違有り
    + 比較した1つ以上のファイルが相違していた時に 1 になります。
    + 比較相手のファイルが存在しない時は、2 になりますので気を付けます。
    + 「オフセット 393 で比較エラーがあります」 = 相違点を発見しました。
    + 「ファイルが見つからないか、開けません: ネギ.txt」 = 差分表示を途中で止めました。
o 2 = 比較するファイルが開けない時。もしくは書式エラー
    + 「FC: ネギ.TXT を開けません。このファイルまたはフォルダは存在しません」 = 対応する「比較相手のファイル名」のファイルが見つかりませんでした。
    + 「コマンド ラインの構文が正しくありません」 = おそらく指定したオプションが間違っています。


**** 機能
o 2つのファイルの内容を比較します。フォルダーを指定する事も出来ます。
    + ワイルドカード（「*」や「?」）を使用する事も出来ます。但し、書き方に制限事項がありますので注意します。
    + 詳細は「FCコマンドで、ファイル名のワイルドカードが正しく動かないパターン」
o 最初に、比較するファイル名を出力します。「例。ファイル ミクさん.txt と ネギ.TXT を比較しています...」
o 次に、相違点を出力します。
o その後に、比較結果を表示します。
o 最後に、「ほかのファイルを比較しますか (Y/N)?」と質問します。


**** 使用例
--------
comp ミクさん.txt ミクさん.bak

comp /a /l c:\ミクさん\*.txt c:\ミクさんバックアップ\*.txt
--------
    + コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + 最後に質問してきます。ですので、このコマンドは、自動処理には向いていません。


**** メモ
o 文字コードが UTF-8 のファイルも比較出来ます。
    + 但し、Windows XPで比較結果を文字で表示する時（/A）には、比較結果が正しく表示されない事があります。


**** 確認したバージョン
o Windows XP Service Pack 3 -- 但し、to_dk未検証項目あり（= /OFFLINE）


＝＝
関連ページ：
    ▼Windowsコマンド。ファイルとフォルダー関連（▼ABC順）
    ▼Windowsコマンド一覧（▼ABC順）
    ▼コマンドプロンプト画面
    ▼制作メモ
    ＞ DISKCOMP = フロッピーディスクの内容を比較する。途中に質問あり版
    SORT = ファイルの内容やコマンド出力結果を並べ替えて表示する
    COPY = ファイルをコピーする
    +
    FCコマンドで、ファイル名のワイルドカードが正しく動かないパターン


http://piyopiyocs.blog115.fc2.com/blog-entry-96.html
Windows、バッチファイルでエラーレベルが取れない。（遅延環境変数の展開）
2011. 01. 28   14:20:27
バッチファイルのエラー処理で微妙にハマりました。
ファイルをコピーして、その結果を%errorlevel%で判定していたのですがね。

SETLOCAL

@COPY C:\A.txt Z:\B.txt

IF %ERRORLEVEL% NEQ 0 (
    ECHO エラー。
    EXIT
)

ENDLOCAL

これはOK。
次に以下のテキストファイルを用意してループさせてコピーした所・・
コピーできなくてもエラーレベルが変わらない（#ﾟдﾟ）

◆テキストファイルの中身（text.txt）
　C:\B.txt
　C:\C.txt
　Z:\D.txt


◆コード
SETLOCAL

FOR /F "delims=" %%a IN (C:\text.txt) DO (

    @COPY C:\A.txt %%a

    IF %ERRORLEVEL% NEQ 0 (
        ECHO エラー。
    )
)

ENDLOCAL

なんでだぁ<（￣◇￣;）>
色々調べた所、こんな感じにしたら動きましたφ（－－）

SETLOCAL enabledelayedexpansion
FOR /F "delims=" %%a IN (C:\text.txt) DO (

    @COPY C:\A.txt %%a

    IF !ERRORLEVEL! NEQ 0 (
        ECHO エラー。
    )
)

ENDLOCAL

SETLOCALにenabledelayedexpansionを指定して
変数へのアクセスをパーセント（%）からエクスクラメーションマーク（!）へ変更。
取りあえずFOR文の中とかでエラーレベル判定行っている場合は
こんなんするのが簡単な解決方法みたいです。

理屈が気になる方は「遅延環境変数の展開」でgoogle先生に訊いて下さい。
ざっくり書くと、パーセント（%）アクセスは構文解析時に環境変数を展開、
エクスクラメーションマーク（!）アクセスは実行直前に環境変数を展開らしいです。


setlocal enabledelayedexpansion

set aaa=bbb

IF 0 (

set aaa=ccc
echo %aaa%
echo !aaa!

)
pause

endlocal

とかやってみるとイメージ出来ますかね。
IF文の実行前に%aaa%は展開されちゃっているので、

setlocal enabledelayedexpansion

set aaa=bbb

IF 0 (

set aaa=ccc
echo bbb
echo !aaa!

)
pause

endlocal

と同じ事になるのだと思います。