多くのオブジェクトをかみ砕くスクリプトがありますが、何かが南下しているのを見て、実行の途中でスクリプトを強制終了したい場合があります。残念ながら、System.IO.StreamWriter を使用してログ ファイルに書き込んでいますが、Ctrl-C を送信すると、ログ ファイルが開かれたままになります。
開いているファイルハンドルと接続を適切に閉じることができる、ある種のハンドラーまたは終了関数を定義する方法はありますか?
多くのオブジェクトをかみ砕くスクリプトがありますが、何かが南下しているのを見て、実行の途中でスクリプトを強制終了したい場合があります。残念ながら、System.IO.StreamWriter を使用してログ ファイルに書き込んでいますが、Ctrl-C を送信すると、ログ ファイルが開かれたままになります。
開いているファイルハンドルと接続を適切に閉じることができる、ある種のハンドラーまたは終了関数を定義する方法はありますか?
Try/Catch/Finally を使用して、close() コマンドを Final ブロックに入れてみてください。
PowerShell 2.0 以降ではTrap
、終了エラーが発生したときに起動する を定義できます。複数のトラップを定義して、さまざまな例外をキャプチャできます。これにより、try/catch
あちこちに散らばったり、スクリプト全体を 1 つの大きなtry/catch
.
スクリプトを終了するには、 を使用しますexit
。例外がスローされた場合はtry/catch/finally
、 で close() コマンドを使用しますfinally
。if-test だけの場合は、次のようにしてみてください。
function Close-Script {
#If stream1 is created
if($stream1) {
$stream1.Close()
}
#Terminate script
exit
}
$stream1 = New-Object System.IO.StreamWriter filename.txt
If(a test that detects your error) {
Close-Script
}
ストリームライターの数が時々変わる場合は、それらを配列に集めて閉じることができます。元:
function Close-Script {
#Close streams
$writers | % { $_.Close() }
#Terminate script
exit
}
$writers = @()
$stream1 = New-Object System.IO.StreamWriter filename.txt
$writers += $stream1
$stream2 = New-Object System.IO.StreamWriter filename2.txt
$writers += $stream2
If(a test that detects your error) {
Close-Script
}