【发布时间】:2017-12-19 15:30:04
【问题描述】:
我正在使用 Try/Finally 在 Powershell 中编写一个监控脚本,以便在脚本结束时记录一条消息。该脚本旨在无限期运行,因此我想要一种跟踪意外退出的方法。
所有其他 StackOverflow 帖子和 Help page 我都检查过状态:
即使您使用 CTRL+C 停止脚本,Finally 块也会运行。如果 Exit 关键字从 Catch 块中停止脚本,也会运行 finally 块。
在实践中,我还没有发现这是真的。我正在使用以下人为示例来测试这一点:
Try {
While($True) {
echo "looping"
Start-Sleep 3
}
} Finally {
echo "goodbye!"
pause
}
这里的 Finally 块在每次 Ctrl+C 之后都会被跳过(无回显,无暂停),无论是作为保存的脚本运行还是执行时通过内置的 Powershell ISE。我得到的唯一输出是:
looping
looping
...(repeat until Ctrl-C)
我显然遗漏了一些东西,但我不知道它是什么,尤其是在这么小的代码 sn-p 中。
【问题讨论】:
-
来自同一页面:“请注意,按 CTRL+C 会停止管道。发送到管道的对象不会显示为输出。因此,如果包含要显示的语句,如“Finally 块已运行”,按 CTRL+C 后不会显示,即使 finally 块已运行。”尝试将
echo替换为$finallyRan = true,或其他不生成管道输出的语句。 -
很奇怪,但如果我将
echo换成Write-Host,你的脚本就可以正常工作。检查那里是否真的需要回声。 -
顺便说一句,确定性清理 inside 管道是 really unnecessarily difficult 正是因为这种管道停止能力,仅仅依靠
finally是行不通的。 -
@Vesper Echo 是 Write-Output 的别名,它喷射到输出 (&1) 流。 Write-Host 不写入任何流
-
@b_c 不是真的...
"goodbye!" | Out-file logfile.txt工作得很好。
标签: powershell powershell-3.0 try-finally