ハッシュ値の比較---PowerShellコマンドラインで正しいかどうかを簡便にチェックする

# PowerShellコマンドラインでのハッシュ値の比較（３行でOK）

ダウンロードサイトにハッシュ値が掲載されている場合、特に長いと目視での比較が辛くなる時がある。
以前は、エクセルシートに正しい値を貼り付け、計算した値と一致するかを判別させていた。

正しいハッシュ値の書かれたテキストファイルがあれば、PowerShellのコマンドラインだけで簡便にチェックできる方法が分かったので記しておく。

``` PowerShell:PowerShellコマンドライン(md5での例)
$x = certutil -hashfile [ファイル] md5
$y = cat [正しい値が記載されたファイル]
$x[1] = $y
```
上記で正しければ
> **True**

が表示される。

## 背景事情

今回、サクラエディタのバージョンをv2.4.1からv2.4.2にアップしようと久しぶりにgithubサイトに入ったら、「どれをダウンロードする？」、「『zip.md5』ファイルて何？」状態になったが、[【ITメディアの記事】](https://atmarkit.itmedia.co.jp/ait/articles/0507/30/news017.html "【Windows 11対応】MD5／SHA-1／SHA-256ハッシュ値を計算してファイルの同一性を確認する")などを参考にして、上述のように無事にチェックすることができた。

今回、希にしかダウンロードしないのと7zipをインストールしているがmd5は未対応なので「md5」についてWindowsでのハッシュ値を求める方法をネット検索してcertutilにたどり着く事が多い。
また、PowerShellもDOSコマンドとの差からエラーを吐かれることが多く、コマンドラインでの利用もごく僅かの機能しか使っていなかった。今回、コマンドラインの出力を変数に代入できることを知り、かつ、代入した出力結果が行単位での配列になっていることを知ったので、簡便な方法へとたどり着くことができた。
## ポイント
1. PowerShellのコマンドラインからの出力結果は、変数に代入できる。
1. 複数行の出力結果は、インデックス番号が「0」からスタートする配列変数に入る。
1. 変数の内容が等しいかどうかの比較は二項演算子「-eq」にて比較できる。

## 以下、詳細を含む覚え書きとしての具体例（サクラエディタのバージョンv2.4.2での実行例と各コマンドの意味・内容について）

対象ファイルとmd5の値の入ったフィアルは下記からダウンロードした。
[==> サクラエディタダウンロードサイト](https://github.com/sakura-editor/sakura/releases "https://github.com/sakura-editor/sakura/releases")

![sakura.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504878/ff192cee-f2ff-042d-a576-b7abb601956d.png)


:::note warn
以下、念のため、ハッシュ値の一部を伏せ字にしています。
:::

1. サクラエディタの該当zipファイルと該当zip.md5ファイルの両方をダウンロード（上図の枠で囲った2つのファイル）
1. PowerShellを起動し、ダウンロードした場所へ移動
1. 下記コマンドを実行
    ※内容確認・トレースのため、PowerShell変数への代入前にコマンドライン出力結果を確認する作業を行っています。

``` PowerShell:#1: certutilの実行結果について確認
certutil -hashfile .\sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip md5
```
**【出力結果】**
> MD5 ハッシュ (対象 .\sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip):
> f2fff82*****************cc673401
> CertUtil: -hashfile コマンドは正常に完了しました。

``` PowerShell:#2: certutilの実行結果を変数$xに代入（行単位で配列に入る）
$x = certutil -hashfile .\sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip md5
```

各行が変数$xの配列（`$x[0]`, `$x[1]`, `$x[2]`）に入っていることを確認。

``` PowerShell:#3: （配列としての）変数 $x の内容確認
$x[0]; $x[1]; $x[2]
```
**【出力結果】**
> MD5 ハッシュ (対象 .\sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip):
> f2fff82*****************cc673401
> CertUtil: -hashfile コマンドは正常に完了しました。

上記から目的のハッシュ値が`$x[1]`に入っていることを確認。

``` PowerShell:#4: md5ファイルの内容確認（catコマンドを使った例）
cat .\sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip.md5
```
**【出力結果】**
> f2fff82*****************cc673401

:::note info
catコマンドではなくtypeコマンドでもOK。
もし複数行内部に目的ハッシュ値があれば、該当行を配列要素として取り出せば良い。
:::

``` PowerShell:#4: md5ファイルの内容（ハッシュ値）を変数＄ｙに代入し、＄x[1] と比較
$y = cat .\sakura-tag-v2.4.2-build4203-a3e63915b-Win32-Release-Installer.zip.md5
$x[1] -eq $y
```
**【出力結果】**
> True

以上、初めてのQiitaへの投稿で、内容としては個人的な覚え書きメモです。
markdownを使う練習も兼ねています。

参考サイト
* [【Windows 11対応】MD5／SHA-1／SHA-256ハッシュ値を計算してファイルの同一性を確認する / @IT  Tech TIPS](
https://atmarkit.itmedia.co.jp/ait/articles/0507/30/news017.html "https://atmarkit.itmedia.co.jp")
* [ PowerShell 変数について](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_variables?view=powershell-7.3 "https://learn.microsoft.com")