如何在PowerShell中配置读取主机的超时

plicqrtu  于 2023-02-19  发布在  Shell
关注(0)|答案(3)|浏览(158)

就像我说的,这段代码可以在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..." 
            }}
mnemlml8

mnemlml81#

official文档或Read-Host -?会告诉我们不可能以这种方式使用Read-Host,也没有参数告诉我们运行时要有某种超时。
但是有various和其他questions详细说明了如何在PowerShell中完成此操作(通常使用C#)。
这个想法似乎是检查用户何时使用$Host.UI.RawUI.KeyAvailable按下一个键,并检查超时的持续时间。
一个简单的工作示例如下:

$secondsRunning = 0;
Write-Output "Press any key to abort the following wait time."
while( (-not $Host.UI.RawUI.KeyAvailable) -and ($secondsRunning -lt 5) ){
    Write-Host ("Waiting for: " + (5-$secondsRunning))
    Start-Sleep -Seconds 1
    $secondsRunning++
}

您可以使用$host.UI.RawUI.ReadKey来获取被按下的键。如果您需要比简单的按钮按下更复杂的输入,则此解决方案可能不可接受。

z4iuyo4d

z4iuyo4d2#

Seth,谢谢你的解决方案。我扩展了你提供的示例,并希望将其回馈给社区。
此处的使用情形稍有不同-我有一个循环,检查一组虚拟机是否可以迁移,如果该检查出现任何故障,操作员可以修复这些故障,直到检查清除,或者他们可以选择“执行”并将这些故障虚拟机排除在操作之外。如果键入了执行以外的内容,则状态仍保留在循环中。
这样做的一个缺点是,如果操作员不小心按了一个键,脚本将被Read-Host阻止,可能不会立即被注意到。如果这对任何人来说都是一个问题,我相信他们可以解决这个问题;- )

Write-Host "Verifying all VMs have RelocateVM_Task enabled..."
Do {
    $vms_pivoting = $ph_vms | Where-Object{'RelocateVM_Task' -in $_.ExtensionData.DisabledMethod}
    if ($vms_pivoting){
        Write-Host -ForegroundColor:Red ("Some VMs in phase have method RelocateVM_Task disabled.")
        $vms_pivoting | Select-Object Name, PowerState | Format-Table -AutoSize
        Write-Host -ForegroundColor:Yellow "Waiting until this is resolved -or- type GO to continue without these VMs:" -NoNewline
        $secs = 0
        While ((-not $Host.UI.RawUI.KeyAvailable) -and ($secs -lt 15)){
            Start-Sleep -Seconds 1
            $secs++
        }
        if ($Host.UI.RawUI.KeyAvailable){
            $input = Read-Host
            Write-Host ""
            if ($input -eq 'GO'){ 
                Write-Host -ForegroundColor:Yellow "NOTICE: User prompted to continue migration without the blocked VM(s)"
                Write-Host -ForegroundColor:Yellow "Removing the following VMs from the migration list"
                $ph_vms = $ph_vms | ?{$_ -notin $vms_pivoting} | Sort-Object -Property Name
            }
        }
    } else {
        Write-Host -ForegroundColor:Green "Verified all VMs have RelocateVM_Task method enabled."
    }
} Until(($vms_pivoting).Count -eq 0)
zaq34kh6

zaq34kh63#

还请注意,所有这些$Host.UI的东西在Powershell伊势中不起作用。要从脚本中找出答案,您可以测试$Host.Name -eq "ConsoleHost"。如果为真,您可以使用本主题中的代码。否则,您可以使用$Host.UI.PromptForChoice或任何其他显示对话框的方式。使用System.Windows.Forms.Timer,您可以设置一个计时器,当计时器到期时,可以运行关闭对话框或窗体的代码。

相关问题