我使用
try {} finally {}
为此。finally块在try完成或使用ctrl+c时运行,因此您需要运行任何一种方式都可以安全运行的命令,例如,如果您杀死一个已经死亡的进程,这都无关紧要。。
或者您可以添加一个测试,以查看最后一个命令是否成功,使用
$?
,例如:
try {
Write-Host "Working"
Start-Sleep -Seconds 100
} finally {
if(-not $?) { Write-Host "Cleanup on aisle 5" }
Write-Host "Done"
}
或者创建自己的测试(以防try中的最后一个命令因某种原因失败):
try {
$IsDone = $false
Write-Host "Working"
Start-Sleep -Seconds 100
#.....
$IsDone = $true
} finally {
if(-not $IsDone) { Write-Host "Cleanup on aisle 5" }
Write-Host "Done"
}
更新
:当管道在CTRL+C上停止时,finally块将不适用于输出。
请注意,按CTRL+C可停止管道。发送到的对象
管道将不会显示为输出。因此,如果您
包括要显示的语句,如“Finally block has run”,
在按CTRL+C后,即使最后
块已运行。
资料来源:
about_Try_Catch_Finally
但是,如果从
Receive-Job
到全局变量,如
$global:content = Receive-Job $sleepJob
你可以在finally块之后阅读它。变量通常在不同的本地范围中创建,并在finally块之后丢失。