【发布时间】:2020-08-22 23:37:04
【问题描述】:
当脚本执行Read-Host cmdlet 时,关闭窗口不会激活finally 块。下面是一个任意但功能最少的示例。我正在使用 PowerShell 5.0。 Beep() 只是为了让 finally 块的执行显而易见。
try {
$value= Read-Host -Prompt "Input"
sleep 5
} finally {
[Console]::Beep(880,1000)
}
- 如果在
Read-Host期间单击红色 X 关闭窗口finally块不会执行。 - 如果在
sleep期间单击红色 X 关闭窗口finally块将执行。 - 如果您在任何时候使用 Ctrl-C 中断,
finally块将执行。
关于为什么在Read-Host 期间关闭窗口时finally 块没有执行,我是否缺少一些基本的东西?
完整的案例涉及在 Amazon Snowball 设备上启动服务,如果脚本关闭则需要停止服务。完整的案例行为反映了上面的示例案例。
编辑:由于 cmets 说 $input 是保留变量,将变量从 $input 更改为 $value。不会改变行为。
【问题讨论】:
-
[1]
$Input是保留的自动变量。除非您完全确定您了解副作用,否则不要写信给它。 [grin] [2] 您可能会看到“主机”方式与各种 PoSh 流交互的结果。我认为在控制台直接操作中杀死控制台会完全绕过 powershell。 -
[1] 我将代码 sn-p 更新为没有 $input。即使使用不同的变量,行为也是相同的。 [2] 我确信有区别。奇怪的是在
sleepDOES 激活finally期间杀死控制台窗口。 -
这可能是因为您不再直接在主机中操作 ...您回到了 PoSh 中。
-
在这种情况下有没有办法执行
finally块?即使用户只是关闭窗口,我也想运行一些清理代码。 -
CRTL+C 表示停止运行代码并返回提示。 “X”,表示现在退出会话。如果用户关闭“x”以关闭控制台窗口框并且不响应读取主机,则无论您做什么,都不会发生任何代码。无论您使用哪种语言. 这样做的唯一方法是创建自己的表单以收集用户信息,并在表单关闭/处置事件上采取行动。您可以禁用表单中的“X”并强制使用关闭按钮和因此触发代码形式。
标签: powershell try-catch-finally read-host