试试看.接住在读取主机期间最终失败



脚本执行Read-Hostcmdlet时,关闭窗口不会激活finally块。下面是一个任意但功能最低的示例。我正在使用PowerShell 5.0。Beep((只是为了让finally块执行起来。

try {
$value= Read-Host -Prompt "Input"
sleep 5
} finally {
[Console]::Beep(880,1000)
}
  1. 如果在Read-Host期间单击红色X关闭窗口则CCD_ 4块将不执行
  2. 如果在sleepfinally块将执行
  3. 如果在任何时候用Ctrl-C中断,finally块将执行

Read-Host期间关闭窗口时,为什么finally块没有执行,我是否缺少一些基本信息?

完整的案例涉及在亚马逊雪球设备上启动服务,如果脚本关闭,则需要停止服务。完整案例行为反映了上面的示例案例。

EDIT:将变量从$input更改为$value,原因是注释说$input是保留变量。不会改变行为。

继续我的评论。

控制台主机有点不灵活,这取决于您从它本地执行的操作。"X"与PowerShell会话/进程有关,而不是与其中运行的代码有关。因此,CRTL+C之所以有效,是因为您正在停止代码运行,而不是PowerShell会话/程序。

这里有几种方法可以让你思考自己的选择。

###############################################################################
#region Begin initialize environment                                          #
###############################################################################

# Initialize GUI resources
Add-Type -AssemblyName  System.Drawing,
PresentationCore,
PresentationFramework,
System.Windows.Forms,
microsoft.VisualBasic
[System.Windows.Forms.Application]::EnableVisualStyles()

###############################################################################
#endregion End initialize environment                                         #
###############################################################################
# Prevent the MessageBox UI from closing until an entry is made
while (
($UserEntry = [Microsoft.VisualBasic.Interaction]::
InputBox('Enter a Host/User', 'Add Item')) -eq ''
)
{
[System.Windows.Forms.MessageBox]::
Show(
'Entry cannot be empty', 
"Error on close" , 
0, 
[System.Windows.MessageBoxImage]::Error
)
}
"You entered $UserEntry"

或者一个完整的自定义表单,用于更精细的控制

# Initialize the form object
$form = New-Object System.Windows.Forms.Form
# Define form elements
$form.Text = 'Data Entry'
$txtUserInput           = New-Object system.Windows.Forms.TextBox
$txtUserInput.multiline = $false
$txtUserInput.width     = 120
$txtUserInput.height    = 20
$txtUserInput.location  = New-Object System.Drawing.Point(40,29)
$txtUserInput.Font      = 'Microsoft Sans Serif,10'
$form.controls.AddRange(@(
$txtUserInput
)
)
# Evaluate form events
$form.Add_Closing(
{
param
(
$Sender,$Event
)
$result = [System.Windows.Forms.MessageBox]::Show(
'Are you sure you want to exit?', 
'Close', 
[System.Windows.Forms.MessageBoxButtons]::YesNo
)
if ($result -ne [System.Windows.Forms.DialogResult]::Yes)
{$Event.Cancel = $true}
})
# Start the form
$form.ShowDialog() | Out-Null
# Resource disposal
$form.Dispose()

相关内容

  • 没有找到相关文章

最新更新