Windowsにおいてファイルをチェックサムファイルと比較するためのVBScript

Windowsにおいて、FCIVを利用して、チェックサムファイルによるファイルの検証を行うVBScriptのプログラム。Linuxにおける

$ md5sum --check md5sum.txt

および

$ sha1sum --check sha1sum.txt

に相当することを行う。

チェックサムが合えば「OK」、合わなければ「NG」、ファイルがなければ「File Not Found」を表示する。

Windows XP SP3+FCIV Version 2.05で動作確認。

プログラム

スクリプトのファイル名は、とりあえず「checksum.vbs」としておく(ファイルの配布はしていないので、以下をコピペして保存。文字コードはシフトJIS、改行コードはCR+LFで)。

'FCIVに関するパラメータ  
strFcivPath="c:\fciv\fciv.exe" 'fciv.exeのパス  
strFcivRet = vbCrLf '出力結果の改行コード:vbCrLf/vbCr/VbLf  
strFcivSep = " "    'データの区切り文字  
intFcivInfo = 3     '出力結果の先頭に表示するVersion情報の行数

'Checksumファイルに関するパラメータ  
strChecksumRet=vbLf 'ファイルの改行コード:vbCrLf/vbCr/VbLf  
strChecksumSep="  " 'データの区切り文字

'オブジェクトの生成  
Set objShell = CreateObject("Wscript.Shell")  
Set objFso = CreateObject("Scripting.FileSystemObject")  
Set objArgs = Wscript.Arguments

'引数のチェック  
If objArgs.Unnamed.length=0 Then  
  Wscript.Echo "引数にはChecksumファイルの名前を指定してください。"  
  Wscript.Quit  
End If

'オプションの設定  
If objArgs.Named.Exists("T") Then  
  strT = objArgs.Named.Item("T")  
  If strT="sha1" Or strT="md5" Then  
    strFcivOpt=" -" & strT & " "  
  Else  
    Wscript.Echo "オプションには/T:md5か/T:sha1を指定してください。"  
    WScript.Quit  
  End If  
Else  
  strFcivOpt=" "  
End If

strFilename = objArgs.Unnamed.Item(0)

'Checksumファイルの存在チェック  
If objFso.FileExists(strFilename)=0 Then  
  Wscript.Echo strFilename & "が見つかりません。"  
  Wscript.Quit  
End If

'Checksumファイルの読込  
Set objInFile = objFso.OpenTextFile(strFilename)  
If Err.Number<>0 Then  
  Wscript.Echo "ファイルの読込に失敗しました。"  
  Wscript.Quit  
End If  
strChecksumLine = objInFile.ReadAll  
arrChecksumLine = Split(strChecksumLine, strChecksumRet, -1)  
objInFIle.Close

For Each strElem in arrChecksumLine  
  If strElem<>"" Then '空行を無視  
    arrChecksumPair = Split(strElem, strChecksumSep, -1)  
      
    If objFso.FileExists(arrChecksumPair(1)) Then 'ファイルが存在すれば  
      Set objExec = objShell.Exec(strFcivPath & strFcivOpt & arrChecksumPair(1))

      'Execメソッドで起動したプログラムの実行が終了するまで待つ  
      Do While objExec.Status = 0  
        WScript.Sleep 100  
      Loop

      'FCIVのバージョン情報を除外して結果を取り出す  
      arrFcivVal = Split(objExec.StdOut.ReadAll(), strFcivRet, -1)  
      arrFcivPair = Split(arrFcivVal(intFcivInfo), strFcivSep, -1)  
        
      'チェックサムの照合  
      If arrChecksumPair(0) = arrFcivPair(0) Then  
        Wscript.Echo arrFcivPair(1) & ": OK"  
      Else   
        Wscript.Echo arrFcivPair(1) & ": NG"  
      End If  
    Else  
      Wscript.Echo arrChecksumPair(1) & ": File Not Found"  
    End If  
  End If  
Next  

設定

以下のページからFCIVを入手する:

Availability and description of the File Checksum Integrity Verifier utility (マイクロソフト)

自己解凍形式の圧縮ファイルなので、適当な場所に展開する。fciv.exeとREADME.txtが展開されるので、それらを例えばc:\fcivの下に置く。

FCIVそのものの使い方については、以下の記事で解説:

WindowsにおけるファイルのMD5およびSHA-1による破損チェック

vbsファイル(checksum.vbs)は基本的にどこに置いてもよいが、c:\fcivの下に置くことにする。

必要に応じて、プログラムの以下の部分を編集:

'FCIVに関するパラメータ  
strFcivPath="c:\fciv\fciv.exe" 'fciv.exeのパス

(中略)

'Checksumファイルに関するパラメータ  
strChecksumRet=vbLf 'ファイルの改行コード:vbCrLf/vbCr/VbLf  
strChecksumSep="  " 'データの区切り文字  

スクリプトの実行方法

コマンドプロンプトを起動し、チェックするファイル群のある場所にカレントディレクトリを変更。例えば、Dドライブの中が対象で、チェックサムファイル(md5sum.txt)がDドライブの直下に置かれているような状況だとすれば

C:\Documents and Settings\user> d:

D:\>

スクリプトを実行すると、MD5によるチェックが行われる:

D:\> cscript c:\fciv\checksum.vbs d:\md5sum.txt

あるいは、SHA-1によるチェックを行うには、/T:sha1をオプションとして付加する:

D:\> cscript c:\fciv\checksum.vbs d:\sha1sum.txt /T:sha1

参考書籍

VBScriptハッカーズ・プログラミングVBScriptハッカーズ・プログラミング
(2005/10)
佐藤 信正

商品詳細を見る

VBScriptのプログラムを作成するときに参考にした書籍。VBScriptのコマンドラインでの使い方に関する解説がとても参考になった。

【theme : Windows
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示