Write-Log
poshcode ( http://poshcode.org/3270 ) に投稿した関数を作成し、それを製品レベルの PowerShell プログラムに使用しました。Start-Transcript
または、コンソールに表示されるほとんどすべてをファイルに記録する which を使用することもできます。いくつかの落とし穴がありますStart-Transcript
-
Out-Host
などにパイプしてホスト出力 API を強制しない限り、外部プログラムの出力はログに記録されませんping.exe localhost | Out-Host
。
- すべてのホストでサポートされているわけではありません。たとえば、PowerGUI はそれをサポートしていないため、を使用してホスト チェックを追加する必要があります
$host
。
私が通常エラー処理に使用するパターンは、すべてを try/catch でラップすることです。例外オブジェクトは$_
、catch ブロックのように使用できます。発生したエラー、メッセージ、行番号、列番号などに関するすべてが含まれます...
また、すべてのコマンドレットが終了エラーをスローするように設定して、スクリプトが続行されないようにします$ErrorActionPreference
。Stop
次のようになります。
$ErrorActionPreference = "Stop"
try {
# Write lof of registry values
New-Item -Path HKCU:\Software\MyTest -ItemType Directory
New-ItemProperty -Path HKCU:\Software\MyTest -Name MyTestValue -Value Test
# Register COM Dlls
regsrv32 my.dll
if ($LASTEXITCODE -ne 0) { throw "Failed to register my.dll" }
# Make IIS AppPools
IIS:\>New-WebAppPool NewAppPool
# Start Windows Services
Start-Service -Name MyService
} catch {
Write-Log ("Script failed. The error was: '{0}'." -f $_)
}
ロールバックは簡単ではありません... レジストリはトランザクションをサポートしているため (Vista 以降を想定)、簡単にロールバックできるのはレジストリ操作だけです。トランザクション (データベースなど) を作成し、エラーが発生した場合にロールバックすることができます。あなたが言及した残りの操作には、それらをロールバックするための特定のコードが必要です。次のようにロールバック コードを catch ブロックに追加できます。
} catch {
# Undo the registry transaction.
# Unregister the DLL.
# Delete the App pool if it exists.
# Stop the windows service.
}