就像我说的,这段代码可以在PowerShell版本2中使用,但不能在PowerShell版本5中使用。
function wait
{
$compte = 0
Write-Host "To continue installation and ignore configuration warnings type [y], type any key to abort"
While(-not $Host.UI.RawUI.KeyAvailable -and ($compte -le 20))
{
$compte++
Start-Sleep -s 1
}
if ($compte -ge 20)
{
Write-Host "Installation aborted..."
break
}
else
{
$key = $host.ui.rawui.readkey("NoEcho,IncludeKeyup")
}
if ($key.character -eq "y")
{Write-Host "Ignoring configuration warnings..."}
else
{Write-Host "Installation aborted..."
}}
3条答案
按热度按时间mnemlml81#
official文档或
Read-Host -?
会告诉我们不可能以这种方式使用Read-Host
,也没有参数告诉我们运行时要有某种超时。但是有various和其他questions详细说明了如何在PowerShell中完成此操作(通常使用C#)。
这个想法似乎是检查用户何时使用
$Host.UI.RawUI.KeyAvailable
按下一个键,并检查超时的持续时间。一个简单的工作示例如下:
您可以使用
$host.UI.RawUI.ReadKey
来获取被按下的键。如果您需要比简单的按钮按下更复杂的输入,则此解决方案可能不可接受。z4iuyo4d2#
Seth,谢谢你的解决方案。我扩展了你提供的示例,并希望将其回馈给社区。
此处的使用情形稍有不同-我有一个循环,检查一组虚拟机是否可以迁移,如果该检查出现任何故障,操作员可以修复这些故障,直到检查清除,或者他们可以选择“执行”并将这些故障虚拟机排除在操作之外。如果键入了执行以外的内容,则状态仍保留在循环中。
这样做的一个缺点是,如果操作员不小心按了一个键,脚本将被Read-Host阻止,可能不会立即被注意到。如果这对任何人来说都是一个问题,我相信他们可以解决这个问题;- )
zaq34kh63#
还请注意,所有这些$Host.UI的东西在Powershell伊势中不起作用。要从脚本中找出答案,您可以测试
$Host.Name -eq "ConsoleHost"
。如果为真,您可以使用本主题中的代码。否则,您可以使用$Host.UI.PromptForChoice
或任何其他显示对话框的方式。使用System.Windows.Forms.Timer
,您可以设置一个计时器,当计时器到期时,可以运行关闭对话框或窗体的代码。