バッチファイルで MD5 チェックサムを生成する

今回はバッチファイルで MD5チェックサム(メッセージダイジェスト) を生成してみます。

MD5 チェックサムを生成する方法として、通常 Linux では md5sum コマンドを利用します。下記は md5sum の実行例ですが、各ファイルとそのチェックサムが出力されます。

584da0a485f209242059e6de66aac904 test1.txt
ff0eb2864feb22354747f8c85d42ccb5 test2.txt
00539e9205b2ba8cf6dabd9f123399e2 test3.txt

一方、Windows では md5sum のような標準的なコマンドがないようです。ただ、調べてみると Windows の標準コマンド certutil を利用してチェックサムの算出を行えるもようです。


下記は certutil の実行例です。

C:\tmp> certutil -hashfile test1.txt MD5
MD5 ハッシュ (ファイル test1.txt):
58 4d a0 a4 85 f2 09 24 20 59 e6 de 66 aa c9 04
CertUtil: -hashfile コマンドは正常に完了しました。

md5sum と出力形式は異なりますが、チェックサムが算出されていることが分かります。
今回は、この certutil コマンドを利用して、md5sum コマンドの出力形式でMD5チェックサムを生成するようなスクリプトを作成してみます。


早速ですが、下記のようなコードになりました。

rem FileName: md5sum.bat

@echo off

if "%~1" == "" (
  echo Usage: %~n0 FILE...
  exit /b 0
)

setlocal
set CmdName=CertUtil
set HashMethod=MD5

for %%a in (%*) do for %%f in (%%a) do call :PrintFileHash "%%~f"
exit /b 0

:PrintFileHash
set Hash=
for /f "usebackq delims=" %%h in (`%CmdName% -hashfile "%~1" %HashMethod% ^| find /v "%HashMethod%" ^| find /v "%CmdName%:"`) do set Hash=%%h
if "%Hash%" == "" if "%~z1" == "0" (
	set Hash=d41d8cd98f00b204e9800998ecf8427e
) else (
	exit /b 0
)
set Hash=%Hash: =%
echo %Hash% %~1
exit /b 0


実行してみます。

C:\tmp> md5sum.bat *
584da0a485f209242059e6de66aac904 test1.txt
ff0eb2864feb22354747f8c85d42ccb5 test2.txt
00539e9205b2ba8cf6dabd9f123399e2 test3.txt

md5sum の出力形式にならって出力されていることが分かります。


※なお、スクリプト内に1つ MD5 チェックサム(d41d8cd98f00b204e9800998ecf8427e) が記されていますが、これはファイルサイズが 0 のファイルの MD5 チェックサムです。ファイルサイズが 0 のファイルを certutil に入力すると、エラーとなるため、この場合だけ特別扱いしています。