Powershell が遅かったので早くした(ハッシュ生成、ファイル書き込み)

最終更新日

Comments: 0

はじめに

powershell を使って大量にファイルを処理していたのですが、あまりにも遅くて高速化を行ったのでその時の改善内容を残しておきます、誰かのお役に立てればよいです。

powershell 自身の問題およびコマンドの実行の遅さが原因なのかなと感じました、対策としては.NETオブジェクトを利用するのが一番良い結果が出ていると思います。

ハッシュの生成

変更前

  • hash.tmp に生成したい文字列を格納
  • certutil コマンドで生成したハッシュ値を $hash に格納
Write-Output "文字列" | Set-Content hash.tmp
$hash = (certutil -hashfile hash.tmp MD5)[1..1]

(Get-FileHashコマンドがあるけどツッコミは無しで)

変更後

  • $md5, $utf8 オブジェクトを事前に生成
  • $hash にハッシュ値を格納
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UT8Encoding

for ...
   $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes("文字列")))
   $hash = $hash.Replace("-", "").ToLower()

ファイル書き込み

変更前

  • Write-Output で出力した内容
  • パイプで受け取り、Add-Content でファイルに出力
Write-Output "文字列" | Add-Content hash.log -Encoding Unicode

変更後

  • 事前に $file オブジェクトを生成
  • $file の WriteLine を使ってファイルに出力
$file = New-Object System.IO.StreamWriter("hash.log", $false, [System.Text.Encoding]::GetEncoding("unicode"))

for ...
   $file.WriteLine("文字列")

$file.Close()

参考

  • http://tech.guitarrapc.com/entry/2013/07/22/010759
  • https://yomon.hatenablog.com/entry/2014/07/05/132818
  • https://stackoverflow.com/questions/10521061/how-to-get-an-md5-checksum-in-powershell
  • https://qiita.com/sukakako/items/ede96f6227f010a0f328

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする