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

[玩转系统] 如何暂停 PowerShell 脚本

作者:精品下载站 日期:2024-12-14 13:01:45 浏览:12 分类:玩电脑

如何暂停 PowerShell 脚本


暂停脚本执行的原因有很多。也许脚本需要等待用户输入、减慢执行速度或等待另一个进程结束才能继续。与 Powershell 中的大多数任务一样,暂停脚本的方法不止一种。根据您想要完成的任务,您选择的暂停方法将有其优点和缺点。 PowerShell 的新跨平台功能为可用选项增添了另一个亮点。由于 PowerShell 经常被用作将不同技术“粘合”在一起的一种方式,就像在 Windows 中一样,Linux 命令行具有暂停执行的选项,这些选项也可以合并到 PowerShell 中。

PowerShell 暂停的方法

暂停脚本执行有哪些不同的方法?在本文中,我们将把暂停功能分解为本机命令和非本机命令。我们所说的本机命令是指 PowerShell 或 .NET 内置函数或方法的命令。非本机方法被定义为特定于 Windows 和 Linux 的程序,可以与 PowerShell 结合使用。

本机方法

    Start-Sleep
    [System.Threading.Thread]::Sleep()
    Read-Host
    [Console]::ReadKey()
    $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

    非本机方法

    Windows

      pause
      timeout

      Linux

        sleep
        read -p

        如您所知,有许多不同的选择,每种选择都有其优点和缺点。您使用哪一种将影响执行的暂停方式以及暂停可能包括的其他影响。

        本机方法

        首先,我们将开始概述本机方法,因为它们在脚本中最常用。

        开始-睡眠

        到目前为止,最常用的暂停命令是Start-Sleep。此命令需要两个简单的输入,即 -Seconds-Milliseconds。秒可以是 System.Double 数值,而毫秒仅采用 System.Int32 值。通过将两者结合起来,可以实现对停顿长度的精确控制。 Start-Sleep 也有一个别名 sleep

        Start-Sleep -Seconds 2 -Milliseconds 300

        在 PowerShell 6.2.0 之前,您无法编写小数秒值,例如 2.3,它与我们在上面代码中暂停的时间长度相同。在 6.2.0 中,现在支持小数值,因此您现在可以声明:-Seconds 2.3,而不是单独写出秒和毫秒。

        需要注意的是,您可以使用 Ctrl-C 中断 Start-Sleep 函数。并非所有方法都是如此!

        线程睡眠

        一种不太常用的暂停执行方法是 [System.Threading.Thread]::Sleep() .NET 方法。通过传入 System.Int32 或 TimeSpan 值,可以将当前线程暂停一段设定的时间。例如,要暂停相同的时间(2.3 秒),如我们的 Start-Sleep 示例中所示,我们可以编写:

        [System.Threading.Thread]::Sleep(2300)

        要将时间跨度构造与 Thread Sleep 方法一起使用,您可以执行以下操作:

        [System.Threading.Thread]::Sleep([TimeSpan]::New(0, 0, 0, 2, 300))

        要无限期地暂停线程,您可以使用[System.Threading.Timeout]::InfiniteTimeSpan,但请记住,这可能会锁定您的进程。

        Start-Sleep 不同,Thread Sleep 方法不允许您使用 Ctrl-C 打破睡眠例程。根据您的应用程序,这可能更可取。

        了解线程睡眠的另一个重要原因是它不是精确的时间保证。所有线程睡眠都保证它将至少等待那么多秒。由于线程睡眠计数与时钟滴答一致,因此其他程序可能会中断此暂停功能并强制等待更长的时间。

        虽然线程睡眠有其用途,但由于这些问题,最好使用其他内置方法之一。

        读取主机

        上述方法描述了暂停执行的方法,但仅限于设定的时间。暂停执行的另一种方法是提示用户输入。使用此方法时,必须采取手动操作,但要求确认才能继续并可能包含其他输入可能非常有用。

        Read-Host 是提示用户输入的最常见方法之一。通过提示用户输入,可以保存生成的条目以供在代码中进一步使用,或者根据需要暂停执行。

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

        输入文本后,需要按 Enter 或 Return 键才能继续执行。通过这样做,并且不将输入保存到变量中,这将输出与输入到控制台的相同文本。

        [玩转系统] 如何暂停 PowerShell 脚本

        如果您想将输入的结果文本保存到变量中以供以后使用,只需将 Read-Host 输入分配给变量即可。

        $Input = Read-Host -Prompt "Press any key to continue"

        有时您可能希望将输入作为安全字符串读入。值得庆幸的是,Read-Host 使这变得非常简单。

        $SecureInput = Read-Host -Prompt "Enter your password" -AsSecureString

        Ctrl-C 将允许您跳出 Read-Host 提示符。

        控制台ReadKey方法

        使用[Console]::ReadKey()方法,您可以轻松地读入按键命令以及修饰符,同时暂停程序执行。默认情况下,发送的键盘命令会作为 System.ConsoleKeyInfo 对象回显到屏幕。这包括 KeyKeyCharModifiers 值,这些值在检查某些组合键时非常有用。

        [Console]::ReadKey()

        [玩转系统] 如何暂停 PowerShell 脚本

        通常,您可能希望在继续前进之前检查某个按键输入。这可以使用如下所示的 Do-While 循环轻松完成。

        Do {
        	$Key = [Console]::ReadKey($True)
        	Write-Host $Key.Key
        } While ( $Key.Key -NE [ConsoleKey]::Escape )
        

        [玩转系统] 如何暂停 PowerShell 脚本

        请注意,由于我们正在寻找特定的组合键,因此 Ctrl-C 不会中断此处的输入。

        托管 RawUI ReadKey 方法

        最后,我们有 $host.UI.RawUI.ReadKey() 方法。这与 Console ReadKey 方法类似,但此方法允许将附加选项传递到 ReadKey 方法中以进一步控制行为和输出。

        $host.UI.RawUI.ReadKey()

        [玩转系统] 如何暂停 PowerShell 脚本

        可以传入许多 ReadKeyOptions,这可能会使 RawUI ReadKey 方法更有用。

          AllowCtrlC
          IncludeKeyDown
          IncludeKeyUp
          NoEcho

          这可以按以下方式使用,其中包括按键事件而不回显文本。

          $host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

          此方法将允许使用 Ctrl-C 来中断命令,除非使用 AllowCtrlC 选项。

          非本机方法

          在本节中,我们将探讨一些暂停脚本执行的非本机方法。这些方法旨在利用非 PowerShell 控制台特定的实用程序,这些实用程序可以根据您的需要集成到 PowerShell 脚本中。

          视窗

          暂停

          暂停命令非常简单,会显示 Press any key to continue 。 。 . 并保持这种状态,直到按下某个键来恢复执行。

          cmd /c 'pause'
          

          [玩转系统] 如何暂停 PowerShell 脚本

          您可能会问如何在脚本中使用此命令,但就像使用任何其他命令一样,在脚本中插入 cmd /c 'pause' 命令即可利用本机功能。

          [玩转系统] 如何暂停 PowerShell 脚本

          超时

          超时命令通常用于 Windows 批处理文件中,允许暂停指定的秒数,并可选择忽略任何按键命令。即使超时期限尚未过去,用户击键通常也会恢复执行。它的使用非常简单,只需传入秒数即可。

          # Pause for 2 seconds
          timeout /t 2
          
          # Pause for 5 seconds but disallow keystroke breaks
          timeout /t 5 /nobreak
          
          # Pause indefinitely until a key is pressed
          timeout /t -1

          [玩转系统] 如何暂停 PowerShell 脚本

          就像使用 pause 命令一样,在脚本中插入 timeout 命令,在下面的示例中,我们按 Enter 键继续。

          [玩转系统] 如何暂停 PowerShell 脚本

          Linux

          睡觉

          与 Windows 中的 pause 命令类似,Linux 中的 sleep 命令允许设置任意睡眠值。与暂停命令不同,sleep 命令有更多选项,可以灵活调整睡眠时间。

          sleep 2.3s

          [玩转系统] 如何暂停 PowerShell 脚本

          sleep 命令还可以选择具有后缀,可以允许定义更长的时间段。例子:

          • sleep 1m - 睡眠一分钟
          • sleep 2h - 睡眠两个小时
          • sleep 1d - 睡一天

          阅读-P

          最后,Linux 暂停的另一种方法是使用read应用程序暂停,以便按下回车键继续执行。有一个可选的超时参数,如果在指定时间内未按下回车键,则该参数将继续执行。

          read -p 'Press enter to continue' -t 5

          [玩转系统] 如何暂停 PowerShell 脚本

          结论

          正如您所看到的,有多种方法可以在脚本内或命令行上暂停执行。根据您的需求,它可以像 Start-Sleep 命令一样简单,也可以是更复杂的输入驱动过程。与本机命令相结合,PowerShell 暂停可以在几乎任何环境中提供灵活性并最大限度地提高脚本实用性。

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

          取消回复欢迎 发表评论:

          关灯