右クリメニューからファイルのハッシュ計算


調子に乗って技術ネタもうひとつ。

前エントリでやったようにファイル配るときや、若しくは逆にどこかからファイルをダウンロードしたりしたときなど、改ざんや破損の検知のためにファイルのハッシュ値を調べたいことがあります。
linuxはシェルのコマンドでハッシュ計算できたりするんですが、Windowsのシェル(←PowerShellが出来た今現在、何て呼べばいいのかね。コマンドプロンプト?)にはなかったりするのと、Windows的には右クリックから呼びたいじゃん?
7-Zipとかインストールしてるとそんなメニュー項目が出来たりするんですが、あれ結果がメッセージボックスに表示されるので、コピーできないから微妙に使い勝手悪いんです。そもそも見たい訳じゃなくって、どこかに貼り付けたいんですよ。

調べてみると、CMDでCERTUTIL呼んだり、PowerShellでSystem.Security.なんたら呼んだりしてたわけですが、PowerShell 4.0(標準バンドルOSがWindows8.1)からは Get-FileHash コマンドレットができて、ハッシュ計算がコマンドで出来るようになったんだそうです。

そこまでわかればあとはレジストリの「HKCU\Softoware\Classes\*\shell\」の「なんちゃら\command」にpowershell.exe呼んでうんたらかんたらを書けばいいんだろと、まあ「\」「%」「”」のエスケープに四苦八苦しつつもなんとなくそれらしく完成。

powershellのスイッチ「-windowstyle hidden」が効いてんだか効いてないんだか、一瞬ウィンドウが表示されるのはまあ愛嬌として、Windows 8.1とWindows 10で正常動作することを確認。

さて 7 はどうじゃいなと、PowerShell 5.0をインストールしたところで試してみるとどうもうまくいかない。いろいろ試してみたところ、どうもpowershell.exeへのPATHが通ってない模様。ところがコマンドプロンプトからpowershellって打つと通るんですよ。なぜか右クリでClasses\*のときだけユーザープロファイルの環境変数が読まれていないぽい。

というわけでWindows 7でも動作させるため、「powershell -スイッチ~」って書いてたのをフルパス「C:\wndows\system32\WindowsPowerShell\v1.0\powershell.exe -スイッチ~」に変更。レジストリキーの既定の値の値の種類はREG_SZなので「%SystemRoot%」とか書けないという、なんか微妙に消化不良な感じ^^;

万一システムルートがC:\Windowsでない方は適宜読み替え(書き替え)てください。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\TCCalcHash]
@="&Hash値をクリップボードにコピー"

[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\TCCalcHash\command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -nologo -noninteractive -windowstyle hidden -command \"&{$f=(gi \\\"%1\\\");$o=$f.Name+\\\"`r`n\\\"+$f.Length+\\\" bytes`r`n\\\";('MD5','SHA1','SHA256')|%%{$o=$o+$_+':'+(Get-FileHash -Path $f.FullName -Algorithm $_).Hash+\\\"`r`n\\\"};$o|clip;}\""

上のテキストをテキストエディタに貼り付け、「~.reg」で適当に保存してダブルクリックしてください。←って意味わかんない人はやらないほうがいいと思う。まあそういう人はそもそもハッシュ必要ないと思うし(;^ω^)
「(‘MD5′,’SHA1′,’SHA256’)」と書いてあるところには ‘SHA1’, ‘SHA256’, ‘SHA384’, ‘SHA512’, ‘MACTripleDES’, ‘MD5’, ‘RIPEMD160’ が指定できます(指定数任意)。お好みでどうぞ。

対象

  • Windows 7 (SP1) + PowerShell 4.0以降
  • Windows 8.1
  • Windows 10
  • Windows Server 2008 R2 (SP1)* + PowerShell 4.0以降
  • Windows Server 2012* + PowerShell 4.0以降
  • Windows Server 2012 R2*

* Server製品は動作確認してません。
※ Windows 8 はPowerShell 3.0が標準で、以降のPowerShellをインストールできないらしい(出典:Wikipedia)。
↓責任逃れとも言う。「現状有姿」言いたいだけかも^^;

免責事項

  1. 本ソフトウェアは現状有姿をもって提供されるもので、TAKE-Cはその有効性、有用性について一切の保証をしません。また、本ソフトウェアに関して発生するいかなる問題も、本ソフトウェアを使用する者の責任および費用負担により解決されるものとします。
  2. 本ソフトウェアを使用、若しくは使用できないことによって生ずるいかなる直接的、間接的損害に対し、TAKE-Cは一切の責任を負わないものとします。
  3. コピペのミスや文字化け、または本ページが改ざんされた等がないか、REGファイルは十分に精査の上、各自の責任に於いて実行してください。レジストリを誤って変更すると、深刻な問題が発生することがあります。最悪の場合、OSが起動しなくなる可能性もあります。TAKE-Cは、レジストリの変更により発生した問題に関して一切責任を負いません。

おまけ

上の状態だと、ワンライナーな上にコマンドラインのエスケープを更にREGファイルエスケープで、わけわかになっちゃってますので、PowerShellスクリプトだけ整形したやつを。

$f = (gi "%1");
$o = $f.Name + "`r`n" + $f.Length + " bytes`r`n";
('MD5','SHA1','SHA256') | % {$o = $o + $_ + ':' + (Get-FileHash -Path $f.FullName -Algorithm $_).Hash + "`r`n"};
$o | clip;

参考

PowerShellを使って、右クリックメニューでファイルのハッシュ値を算出する (思い立ったら書く日記)
http://d.hatena.ne.jp/kaito834/20140208/1391869073
Windowsのエクスプローラーからさくっとファイルのハッシュ値を調べる (葉っぱ日記)
http://d.hatena.ne.jp/hasegawayosuke/20150908/p1
Windows PowerShell (Wikipedia)
https://ja.wikipedia.org/wiki/Windows_PowerShell

更新履歴

2016/10/08 「%1」を「”%1″」囲むの忘れてました。