PowerShell 限制暂停脚本接受的键

PowerShell 限制暂停脚本接受的键

将以下几行放在 PowerShell 脚本末尾具有以下功能:

  if($Host.Name -eq "ConsoleHost")
  {
    Write-Host "Press any key to continue..." -NoNewline
    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null
  }
  1. 如果我通过右键单击脚本并转到“使用 PowerShell 运行”来运行该脚本,那么控制台窗口将保持打开状态,直到我按任意键继续。
  2. 如果我已经打开了 PowerShell 窗口并从该窗口内运行脚本,那么尽管仍然会出现“按任意键继续”文本,但我实际上不必按任何键即可继续;它会自行执行此操作。因此,我可以立即运行其他程序。

我喜欢这种行为,但如果可能的话,我更愿意将其限制为特定的键子集(甚至只是一个键,例如回车键)。使用 read-host 不起作用,那么即使从另一个 PowerShell 窗口运行,我仍然必须输入;目标是当我从上下文菜单运行它时简单地阻止窗口关闭。 从已经存在的 PowerShell 控制台运行时,我不需要输入任何内容。

基本上,我喜欢上面代码的功能,但我想限制它适用的键。

有可能实现吗?如果可以,如何实现?

答案1

至于这个...

目标是当我从上下文菜单运行它时阻止窗口关闭

我们都知道,发生这种情况的原因是上下文菜单只是运行 powershell.exe,而您的脚本是一个参数。因此,它应该关闭。如果不更改上下文菜单执行对脚本主机的调用的方式,您就无法从上下文菜单中执行您想要的操作。

当然,您可以进入注册表并对其进行修改以更改它。但是,要快速处理至少这个右键单击 .ps1 即可关闭窗口,而无需修改注册表。试试这个。

1 - 创建一个新的桌面快捷方式并将以下内容放在目标框中。

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -noexit

2 - 将快捷方式命名为 PowerShell,或其他名称

3 - 将其复制到您的 SendTo 文件夹:C:\Users\YourUserName\AppData\Roaming\Microsoft\Windows\SendTo

右键单击您的脚本并选择SendTo,然后选择您的快捷方式。

当然,这只需单击一次,但与编写其他内容相比,实现起来非常简单。

与任务栏一样,您实际上可以将任何内容放入“SendTo”文件夹中,以处理您想要处理/使用/运行的文件类型。

至于这个...

我希望将其限制为特定的一组键(或者甚至只是一个键,例如回车键)

老实说,我不确定这一点(因为你必须更改消息并告诉用户按哪个键,因为你正在更改默认值),我相信你有你的理由,但这当然需要更多的工作,我必须先玩弄它。

答案2

以下是我让 Readkey 限制其输入的方法。

在函数中,有一个有效字符数组,代码会使用 ($ValidCHARs -match $Response.Character) 条件检查这些字符。如果不匹配,则会忽略输入。

这还不处理 Ctrl、Alt、Shift 等。如果您需要这些功能,请在下面评论您的建议,我会将其添加到此功能中。

Function Keyboard_Input { # KeyMode1 - One keystroke only, No Enter Required (Uses $Host.UI.RawUI.ReadKey)

    [array]$ValidCHARs = @( #Change these entries to allow more characters
    "A"
    "C"
    "D"
    "E"
    "J"
    "L"
    "M"
    "N"
    "P"
    "S"
    "T"
    "V"
    "0"
    )

    Write-Host "You must type one of the following: ";$ValidCHARS -join ","
    Write-Host ""
    Write-Host "Please press a key to make your selection..."

    $Host.UI.RawUI.FlushInputBuffer() #Needed to get a whole new keystroke entry

    DO {[array]$Response = $Host.UI.RawUI.ReadKey("IncludeKeyDown,NoEcho")} UNTIL ($ValidChars -match $Response.Character)

    Write-Host ""
    Start-Sleep -Milliseconds 250
    Write-Host "################################################"
    Write-Host -no "Attributes of Response are: " -F Red;Get-Variable -Name Response | Select *;Start-Sleep -Milliseconds 500
    Write-Host "################################################"
    Write-Host "The Response Record Values are: " -F Red;$Response
    pause
}

Keyboard_Input
pause

相关内容