1

本番環境でPowerShellコマンドレットを分析するための最良の方法は何ですか?次のようなスクリプトを作成するとします-

  1. レジストリ値のlofを書き込む
  2. COMDLLを登録する
  3. IISAppPoolsを作成する
  4. Windowsサービスを開始する

&...その間に問題が発生した場合、根本的な問題を追跡してデバッグできるようにユーザーに通知するためのベストプラクティスは何ですか?

なんらかの理由でAppPoolの作成でユーザーの資格情報が失敗し、その時点で処理を停止し、さらに以前に行ったことをロールバックしたいとします。

詳細モード+ロギングは、すべてのステップで各詳細を収集するためのエレガントな方法ですか?

4

2 に答える 2

2

Write-Logposhcode ( http://poshcode.org/3270 ) に投稿した関数を作成し、それを製品レベルの PowerShell プログラムに使用しました。Start-Transcriptまたは、コンソールに表示されるほとんどすべてをファイルに記録する which を使用することもできます。いくつかの落とし穴がありますStart-Transcript-

  1. Out-Hostなどにパイプしてホスト出力 API を強制しない限り、外部プログラムの出力はログに記録されませんping.exe localhost | Out-Host
  2. すべてのホストでサポートされているわけではありません。たとえば、PowerGUI はそれをサポートしていないため、を使用してホスト チェックを追加する必要があります$host

私が通常エラー処理に使用するパターンは、すべてを try/catch でラップすることです。例外オブジェクトは$_、catch ブロックのように使用できます。発生したエラー、メッセージ、行番号、列番号などに関するすべてが含まれます...

また、すべてのコマンドレットが終了エラーをスローするように設定して、スクリプトが続行されないようにします$ErrorActionPreferenceStop次のようになります。

$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.
}
于 2012-05-20T20:35:15.393 に答える
2

レジストリを直接操作するには、PowerShell のトランザクション サポートを使用して、スクリプトが全体的に成功したときに変更をコミットするか、トランザクションを元に戻してレジストリの変更をロールバックします。

try {
    $ErrorActionPreference = 'Stop' # convert all errors to terminating errors
    Start-Transaction
    Set-ItemProperty Acme -Name Count -Value 99 -UseTransaction
    Remove-ItemProperty Acme -Name InstallDir -UseTransaction
    New-Item Acme2 -UseTransaction
    New-ItemProperty Acme2 -Name Count -Value 2 -UseTransaction
    New-ItemProperty Acme2 -Name InstallDir -Value 'C:\Program Files\Acme2' -UseTx

    ... do other stuff ...

    Complete-Transaction
}
catch {
    Undo-Transaction
    ... Log failure ...
}
于 2012-05-20T20:44:53.177 に答える