当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 PowerShell 中按任意键继续 [6 种方式]

作者:精品下载站 日期:2024-12-14 05:25:15 浏览:14 分类:玩电脑

在 PowerShell 中按任意键继续 [6 种方式]


PowerShell集成脚本环境(ISE)和命令行控制台的解决方案

使用Read-Host Cmdlet

使用Read-Host命令在PowerShell中启用按任意键继续

使用读取主机 Cmdlet:

Read-Host -Prompt "Press any key to continue..."

输出 :

Press any key to continue...: pressed
pressed

Read-Host cmdlet 是最常用且易于理解的。我们用它来暂停执行并提示用户从 PowerShell 控制台获取输入行。请记住,我们必须按 Enter 才能退出暂停模式。

此处,-Prompt 参数用于指定提示文本,允许用户键入字符串。如果字符串包含空格,则将其括在引号内。

我们还可以使用 Read-Host cmdlet 提示用户获取安全数据,例如密码,因为我们可以使用 -AsSecureString-AsSecureString 将接收到的输入字符串保存为安全字符串code>参数如下:

将 Read-Host 与 -AsSecureString 结合使用:

Read-Host "Enter a Password" -AsSecureString

输出 :

Enter a Password: ****

请记住,Read-Host 只能接受 1022 个字符作为用户给出的输入。

使用消息框 UI

当我们只想启用一个键在 PowerShell 中继续时,这种方法很实用。因此,为了允许:

  • New-Object-ComObject 参数结合使用来指定 COM 对象的编程标识符。
  • 使用 .Popup() 函数在弹出窗口中显示文本。

使用消息框用户界面:

$Shell = New-Object -ComObject "WScript.Shell"
$Button = $Shell.Popup("Press OK to continue.", 0, "Hi", 0)

[玩转系统] 在 PowerShell 中按任意键继续 [6 种方式]

我们可以使用 New-Object cmdlet 创建 COM 对象或 .NET 框架的实例。我们可以编写 COM 对象的 ProgID 或 .NET 框架类的类型。

对于上面的代码围栏,我们使用 New-Object 创建 COM 对象的实例。然后,我们使用 New-Object cmdlet 指定 -ComObject 参数来写入 COMProgID) /code> 对象,它是 WScript.shell 并将引用保存在 $Shell 变量中。

接下来,我们使用 Popup() 方法在弹出消息框中显示文本。我们只能通过将 Popup() 方法与 WshShell 对象链接来使用它,在我们的例子中是 $Shell.Popup() 方法有四个值;下面我们来了解一下它们:

  • strText - 包含一个字符串类型的值,它是我们的弹出消息框中显示的文本消息。我们使用按确定继续作为strText参数的值。
  • nSecondsToWait - 它是一个可选参数,包含一个数值,表示显示弹出消息框的最长时间(以秒为单位)。如果此参数设置为默认值0,则消息框将一直可见,直到用户按OKX。如果用户从键盘上按 Enter,消息框也将关闭。
  • strTitle - 它还保存一个字符串类型值,用作弹出消息框的标题。
  • nType - 一个可选参数,它保存一个数值,表示我们要在弹出消息框中使用的图标/按钮的类型。例如,我们使用 0 来显示 OK 按钮。您可以在此处找到不同类型的控件(按钮)和图标的不同十进制值。

最后,我们使用 $Button 来保存一个数值,该数值由 .Popup() 方法返回。该数值表示用户单击以关闭弹出消息框的按钮数量。

注意:我们还可以为nType参数指定十六进制值。

到目前为止,我们已经了解了适用于 PS-ISE(PowerShell 集成脚本环境)、图形用户界面和前端托管的各种方法。但是,以下几种方法仅适用于 PowerShell 命令行控制台。

PowerShell 命令行控制台解决方案

使用带/不带[void]ReadKey()方法

使用 ReadKey() 方法在 PowerShell 中启用按任意键继续

将 ReadKey() 与 void 一起使用:

[void][System.Console]::ReadKey($true)

上面的命令会等待,直到用户按任意键才能继续。请注意,此命令不接受单个修饰键(Alt、Ctrl 和 Shift)。

让我们把这个命令分解成几个部分,以便更清楚地了解它。首先,ReadKey($true) 等待,这意味着在发出 ReadKey 方法的线程上被阻塞,并获取用户按下的功能或字符键。

这里,功能键或字符键可以是单个或与修饰键(Alt、Ctrl和Shift)组合。但是,如果仅按任意修饰键,则不会导致 ReadKey 方法返回。

我们将 $true 参数传递给 ReadKey() 方法,因为我们不想在控制台窗口中显示按下的键。但这是可选的;如果我们要在控制台窗口中显示按下的键,我们可以省略此参数或传递 $false 。请参阅以下示例。

将 ReadKey() 与 $false 参数一起使用:

[void][System.Console]::ReadKey($false)

使用不带任何参数的 ReadKey():

[void][System.Console]::ReadKey()

我们使用静态成员运算符 (::) 来调用 .NET 框架的名为 System.Console 的静态类。我们还可以使用 :: 运算符来调用 .NET 框架的静态属性。现在,什么是 System.Console?

在 .NET 框架中,我们有一个名为 Console 的类,位于 System 命名空间中。 System.Console 类允许我们以编程方式访问控制台应用程序中的 stdin、stderr 和 stdout。这里,stdinstderrstdout 表示控制台应用程序的输入、错误和输出流。

现在的问题是,为什么我们要使用[void]?在回答这个问题之前,请使用以下不带 [void] 的命令并查看其输出。

使用不带 void 的 ReadKey():

[System.Console]::ReadKey($true)

输出 :

KeyChar     Key Modifiers
-------     --- ---------
      5 NumPad5         0

看,我们正在获取有关按下的键的信息。现在,尝试回忆一下我们在哪里了解到,当我们不想显示有关按下的键的数据时,会将 $true 参数传递给 ReadKey() 方法。控制台,但上面的示例的行为方式完全不同;为什么?

这是因为任何输出或返回某些数据的表达式或命令都会隐式显示到输出流(也称为成功流),默认情况下输出流会发送到主机,即运行 PowerShell 会话的终端(控制台窗口)。

如果我们不想输出该数据,则必须抑制它。为了抑制,我们有多种选择,其中包括 ... | Out-Null... > $null[void] (...)$null=....因此,我们使用[void]来抑制[System.Console]::ReadKey($true)返回的数据。请注意,[void] 表示预先抑制输出的意图。

现在,考虑一种情况,我们必须显示按下的键和相关数据,这些数据以 System.ConsoleKeyInfo 对象的形式存储。在这种情况下,我们使用以下命令。

使用 ReadKey() 方法:

[Console]::ReadKey()

输出 :

g
KeyChar Key Modifiers
------- --- ---------
      g   G         0

使用RawUI.ReadKey()方法

要在 PowerShell 中启用按任意键继续

  • 使用 Write-Host 编写用户友好的消息。
  • 使用 RawUI.ReadKey() 从键盘设备读取击键。

使用 RawUI.ReadKey() 方法:

Write-Host -NoNewLine 'Press any key to continue...';
$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

输出 :

Press any key to continue...
VirtualKeyCode Character ControlKeyState KeyDown
-------------- --------- --------------- -------
           104         8       NumLockOn    True

在这里,我们使用 Write-Host cmdlet 在 PowerShell 控制台上显示用户友好的消息,并指导用户应该做什么。

接下来,我们使用 -NoNewLine 参数连接输入对象以形成输出。输出字符串之间不会插入换行符或空格。同样,在最后一个输出字符串之后不会添加新行。

之后,我们使用了 $Host.UI.RawUI.ReadKey() 方法,该方法类似于我们在上一节。它可以接受任何键,甚至是修饰键,其中包括 Ctrl、Shift、Alt 和其他修饰键。

请注意,我们可以在带或不带 ReadKeyOptions 的情况下使用 RawUI.ReadKey(),其中包括 IncludeKeyDownIncludeKeyUpNoEchoAllowCtrlC。因此,对于上面的代码示例,我们将 ReadKey()ReadKeyOptions 一起使用,并获取数据作为输出,并以 KeyInfo 对象的形式保存。

如果您对更多技术细节感兴趣,让我告诉您,$Host.UI 是一个 System.Management.Automation.Internal.Host.InternalHostRawUserInterface 对象。相反,$Host 是一个自动变量,其类型为System.Management.Automation.Internal.Host.InternalHost。因此,我们可以使用$Host.GetType().FullName命令来了解$Host变量的类型。

使用cmd /c暂停命令

使用 cmd /c Pause 命令在 PowerShell 中启用按任意键继续

使用 cmd /c 暂停 命令:

cmd /c pause

输出 :

Press any key to Continue

上述命令启用并显示 Press any key to continue... 并等待用户按任意键。一旦用户按下任何键(不包括修饰键),它就会返回。

使用 timeout /t 命令

使用timeout /t命令启用按任意键继续并等待指定的秒数或用户在PowerShell中的输入。

使用超时 /t 命令:

timeout /t 10

输出 :

Waiting for 10 seconds, press a key to continue ...

上面的timeout命令将执行暂停一段时间或无限时间。在这里,我们使用 /t 来指定时间(以秒为单位)。请注意,给定时间必须在 -199999 范围内。例如,如果没有按下任何键,上述命令将等待 10 秒。

我们可以使用以下命令无限等待,直到用户按下除Fn、Ctrl和Alt等之外的任何键。

使用超时 /t 命令:

timeout /t -1

这就是如何在 PowerShell 中按任意键继续。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯