在 PowerShell 中等待每个命令完成

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. 在 PowerShell 中使用 Out 命令等待每个命令完成
  2. 在 PowerShell 中使用 Start-Process Cmdlet 等待每个命令完成
  3. 在 PowerShell 中使用后台作业等待每个命令完成
  4. 在 PowerShell 中使用 Wait-Process Cmdlet 等待每个命令完成
  5. 在 PowerShell 中使用 [Diagnostics.Process] 类等待每个命令完成
在 PowerShell 中等待每个命令完成

通常,Windows PowerShell 在启动以下命令之前会等待内部命令。

此规则的一个例外是基于外部 Windows 子系统的 EXE。此外,Windows PowerShell 在运行可执行程序时不会等待命令完成。

本文将向你展示如何强制 Windows PowerShell 环境等待带有可执行文件的命令完成,然后再转到以下命令。

在 PowerShell 中使用 Out 命令等待每个命令完成

如前所述,运行可执行文件不会等待命令完成,而是直接转到以下命令。我们可能需要避免这种情况,特别是如果我们创建一个应该顺序运行应用程序的脚本。

一个绝妙的技巧是使用 Out 命令之一,例如 Out-Null。运行应用程序时,通过管道传送 Out-Null cmdlet 将诱使 Windows PowerShell 在正在运行的应用程序之上运行底层 cmdlet。

请记住,cmdlet Out-Null 不会在控制台中显示任何内容,因此它看起来像是一个标准运行的应用程序。唯一的区别是它等待整个命令行执行。

示例代码:

Notepad.exe | Out-Null

我们可以使用的其他 Out 命令示例如下:

  • Out-Default - 将输出发送到默认格式环境和默认输出 cmdlet。
  • Out-File - 将输出发送到文件。
  • Out-GridView - 将输出发送到单独窗口中的交互式表格。
  • Out-Host - 将输出发送到命令行。
  • Out-Printer - 将输出发送到打印机。
  • Out-String - 将对象作为一系列字符串发送到主机。

在 PowerShell 中使用 Start-Process Cmdlet 等待每个命令完成

使 Windows PowerShell 等待命令行完成的另一种方法是 Start-Process cmdlet。

例如,我们可以使用 Start-Process cmdlet 的 -Wait 参数,Windows PowerShell 将等待进程完成,然后再执行以下命令行。

Start-Process notepad.exe -NoNewWindow -Wait
注意
上例中的 -NoNewWindow 参数将启动当前进程而不打开新的控制台窗口。

使用 PowerShell 社区扩展版本,首先创建一个新对象。一旦创建了对象,就会调用 WaitForExit() 函数。

$proc = Start-Process notepad.exe -NoNewWindow -PassThru
$proc.WaitForExit()

在 PowerShell 中使用后台作业等待每个命令完成

使 Windows PowerShell 等待命令行完成的另一种方法是使用后台作业。

后台作业是在本地机器的单独进程中运行的一个命令或一组命令。后台作业的示例语法如下所示。

$job = Start-Job { notepad.exe }
Wait-Job $job
Receive-Job $job

调用 Wait-Job cmdlet 将使进程等待,直到在命令行中调用 Receive-Job

在 PowerShell 中使用 Wait-Process Cmdlet 等待每个命令完成

使 Windows PowerShell 等待命令行完成的另一种方法是 Wait-Process cmdlet。

就像我们的第一个示例一样,我们可以将其通过管道传输到我们的可执行文件中并等待命令行完成。但是,使用此 cmdlet 仅适用于 Windows PowerShell 版本 5.1 及更低版本,不适用于最新的 PowerShell (Core) 7。

Notepad.exe | Wait-Process

在 PowerShell 中使用 [Diagnostics.Process] 类等待每个命令完成

如果你的系统中安装了 .NET 库,你可以使用 [Diagnostics.Process] 类等待进程完成,然后再转到以下命令行。

但是,我们不建议使用它,因为 Windows PowerShell 中提供了其他更简单的 cmdlet,我们可以充分利用它们。如果 PowerShell 命令不可用,请仅使用 .NET 库。

[Diagnostics.Process]::Start('notepad.exe').WaitForExit()
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn