1

私は、次のことを行うバッチ ファイルを作成するという簡単なタスクを自分自身に与えました。

「first」フォルダの各ファイルと「second」フォルダの各ファイルの CRC32 を比較します。出力は、「最初の」フォルダーからのすべてのファイルの名前である必要があり、「2 番目の」フォルダーには重複がありません。

注: 「CRC32.exe -nf」は、1 行目に CRC32 を出力し、2 行目にファイル サイズを出力します。

これが私がそれをやろうとした方法です:

@echo off

for %%i in ("%cd%\first\*.*") do (
    set uniq=0
    for /f %%x in ('crc32 %%i -nf') do (
        set one=%%x
        goto find_two
    )
    :find_two
    for %%j in ("%cd%\second\*.*") do (
        for /f %%x in ('crc32 %%j -nf') do (
            set two=%%x
            goto compare
        )
        :compare
        if one==two (
            goto next
        ) else (
            set uniq=1
        )
    )
    if uniq==1 (
        echo %%i >>result.txt
    )
    :next
)

このコードにはいくつかのエラーがあると思いますが、見つけるのに苦労しました。誰かが時間に余裕があり、彼が助けることができると思うなら、私は感謝します.

別のアプローチが必要だと思われる場合は、遠慮なく示してください。

4

2 に答える 2

0

次のようなものを使用して、crc32 の出力をキャプチャする方が簡単かもしれません。

for /f %%x in ('crc32 "%filename%" -nf ^| find /v "CRC32"') do stuff with %%x

これが役に立たない場合は、crc32 の例の完全な出力を見せてもらえますか?

于 2013-02-07T20:22:49.470 に答える
0

2つの大きな問題があります。

Goto の内側の括弧は期待どおりに機能せず、すぐにループを停止するため、コードはそこで失敗します。
解決策は、関数を回避するgotoか呼び出して、そこで使用するgotoことです。

2番目の問題は比較です。変数の内容ではなく 単語を
if one==two (単語 と比較するため、 は常に false になります。onetwo

通常は を使用if "%one%"=="%two%" echo equalしますが、ブラケット内で動作するはずなので、展開を遅らせる必要があるため、次のようになります。

if !one!==!two! echo equal

ループを開始する前に、遅延拡張を有効にすることを忘れないでください

setlocal EnableDelayedExpansion
于 2013-02-07T20:20:09.990 に答える