LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-28

私的メモでここにコピー

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0