私のバッチ スキルは限られています。多数のファイルの結果を生成するには、 を使用しますDIR /a-d /s /b > dirlist.txt
。dirlist.txt を Excel (列 A) にインポートし、それを使用してファイルごとのコマンド (列 B) を生成し、それをバッチ ファイルにコピーします。ループよりも面倒ですが、少なくとも理解できます。
現在の状況では、CRC32 の計算が必要です。対応するファイル名なしで CRC32 値のみを表すコマンドライン ツールがあります。したがって、Excel ソリューションでは、ECHO D:\[full path].ext >> output.txt
CRC32 値 (つまり、アンパサンド ( &
) の後にCRC32.exe "D:\[full path].ext" >> output.txt
) を計算する前にファイル名 (つまり、 ) を出力します。つまり、スプレッドシートは、ファイル名と CRC32 値を指定する単一のコマンドを生成します。
残念ながら、この方法では output.txt の 1 行にファイル名が出力され、次の行に CRC32 値が出力されます。この 2 つを同じ行に出力することは可能だと思いますが、この状況はチュートリアルで見た単純な例よりも複雑に思えます。そこで質問ですが、ファイル名と CRC32 値を 1 行の出力で示す比較的簡単な方法はありますか?
答え1
完全なバッチ ソリューションにまったく反対でない場合は、次の方法が適しています。
@echo off
set "list=dirlist.txt"
set "out=output.txt"
dir /a-d /s /b > %list%
setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (%list%) do (
set "path=%%A"
for /f %%B in ('CRC32.exe "!path!"') do (
set "calc=%%B"
echo !path! + !calc! >> %out%
)
)
と の両方に変数を設定してdirlist.txt
、output.txt
必要に応じて固定パスでこれらを更新しやすくし、DIR
コマンドは変更されません。 ループについては、setlocal enabledelayedexpansion
を使用できるようにして、ループ内変数を使用できるようにします。最初のループはtoken=*
のすべての行 ( )を調べて、それを 変数として設定したdirlist.txt
パラメータ に割り当てます。次に、変数を引数として実行するネストされたループがあり、出力を に割り当てて、それを変数として設定します。最後に、の同じ行にと をエコーできます。上記の例では、(質問のタイトルに基づいて) でそれらを区切っていますが、好きなものを使用することも、何も使用しないこともできます。ただし、 を使用して特殊文字をエスケープする必要がある場合があることを覚えておい てください。CRC32.exe を持っていないため、for ループ内のコマンドの構文は、質問に対する私の理解に基づいています。これがお役に立てば幸いです。%%A
path
CRC32.exe
!path!
%%B
calc
!path!
!calc!
output.txt
+
^
答え2
ディレクトリとそのサブディレクトリ内のすべてのファイルについて、crc32.exe を使用してハッシュ/チェックサムを計算し、完全修飾パス名とその後に続くハッシュ値を同じ行にテキスト ファイルに出力します。
ダウンロードスクリプトそれを Windows フォルダーに配置します。
@echo off
setlocal enableextensions
cd.> dirlist.txt
for /F "eol=| tokens=* delims=" %%g in ('dir *.* /S /A-D /B 2^>nul') do (
for /F %%h in ('%systemroot%\crc32.exe "%%g"') do (
echo %%g + %%h >> dirlist.txt
)
)
exit
rem