noise

計算機科学や各種設定のメモ

PowerShellで副作用のある処理を行うための補助スクリプト

ファイルの移動、コピー、削除などの処理を安全に行うための関数

function exec_sideeffect($wip=$WhatIfPreference, $scriptblock) {
  $wip_orig = $WhatIfPreference
  $eap_orig = $ErrorActionPreference
  $WhatIfPreference = $wip -or $wip_orig
  $ErrorActionPreference = "stop"
  try {
    &$scriptblock
  } catch [Exception] {
    throw $Error[0]
  } finally {
    $WhatIfPreference = $wip_orig
    $ErrorActionPreference = $eap_orig
  }
}
説明
  • $WhatIfPreferenceと$ErrorActionPreferenceを一時保存し終了後、元に戻す。
  • 例外安全。
  • 引数を省略すれば現在の$WhatIfPreferenceに従う。

cmd.exeで発生したエラーをPowerShellの例外に置き換える。

function exec_cmd($str) {
  cmd /c $str | Out-Null
  if($lastexitcode -ne 0) { throw "Exception : cmd /c $str" }
}
説明
  • 正常にコマンドが実行されたら$lastexitcodeに0が入る。
  • コマンド実行後、そのままでは終了を待機せず次の処理に移ってしまう。そこで、パイプラインでOut-Nullに接続することで待機することとする。

使用法

function processHoge {
  exec_sideeffect -Wip $True -ScriptBlock {
    gci -filter "*.jpg" | %{ mv $_.FullName $target_dir }
    exec_cmd "hogehoge.bat"
  }
}
説明
  • 引数で指定したWhatIfPreferenceでScriptBlockを実行する。
  • hogehoge.bat内のエラーは例外として捕捉される。