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

[玩转系统] 如何在 PowerShell 中等待命令

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

如何在 PowerShell 中等待命令


当您从 PowerShell 运行命令或启动进程时,您通常希望等待命令或进程完成,然后脚本才能继续。最简单的选项是使用 Start-Process cmdlet 中的 -Wait 参数,但还有其他选项。

在本文中,我们将了解如何使用 -Wait 参数、使用 Wait-Process cmdlet,并且还将向您展示一些其他选项。

在 PowerShell 中等待

我们可以使用 PowerShell 执行各种任务,包括启动程序或运行另一个命令。但 PowerShell 的“问题”是,它默认不会等待程序或命令完成。

它只会尝试启动程序或运行命令,如果成功,它将继续执行脚本的下一部分。现在,在某些情况下,您希望 PowerShell 在继续之前等待。为此,我们有几个选择:

  • Start-Process cmdlet 的 -Wait 参数
Wait-Process
Start-Sleep

带有 -Wait 选项的 Start-Process cmdlet

当您想要从 PowerShell 运行程序或命令时,可以使用 Start-Process cmdlet。让我们看一个例子,我们将在记事本中打开一个文本文件,并等待用户关闭该文件,然后再继续执行脚本:

# Open File1.txt in the default editor (notepad)
Start-Process -FilePath "C:\temp\File1.txt" -Wait

# Notepad is closed, get the content of the file
Get-Content -path "C:\temp\File1.txt"

如果你在PowerShell中运行上面的代码,你会看到记事本会打开,允许你在文件中写入内容,关闭它后,文件的内容将显示在控制台中。

[玩转系统] 如何在 PowerShell 中等待命令

等待进程 cmdlet

另一种选择是使用 Wait-Process cmdlet。此 cmdlet 等待一个或多个进程关闭,然后才允许 PowerShell 继续。需要注意的是,Wait-Process cmdlet 不适用于 Linux 或 macOS。

要检查进程是否关闭,我们首先需要知道进程名称或进程ID。另一种选择是使用进程对象,例如,我们可以使用 Get-ProcessStart-Process cmdlet 获取该对象。

如果您知道进程名称并且该名称是唯一的,那么您可以简单地使用 -name 参数来获取并等待进程完成:

Wait-Process Name "Notepad"

另一种选择是首先使用 Get-Process cmdlet 查找进程。此 cmdlet 将列出所有正在运行的进程,但我们也可以使用 -name 参数按名称过滤进程。值得高兴的是,我们可以在名称中使用通配符:

$proc = Get-Process -Name "Notepad"
Wait-Proces -Id $proc.id

我们还可以将 Start-Process 和 Wait-Process 结合起来。为此,我们需要使用 Start-Process cmdlet 的 -PassThru 参数,以便它返回进程对象。

这允许我们在进程运行时执行操作,但稍后在脚本中检查进程是否完成,然后再继续最后一部分:

# Start the process
$process = Start-Process -FilePath "notepad.exe" -ArgumentList "C:\temp\File1.txt" -PassThru

# Do something in between
Write-Output "Process $($process.Id) is running."

# Wait untill process is finished
Wait-Process -Id $process.Id
Write-Output "Process has finished."

开始睡眠 cmdlet

在 PowerShell 中等待进程完成的最后一个方法是 Start-Sleep 方法。此 cmdlet 无法检查进程是否正在运行,而只能让 PowerShell 等待 x 时间。

例如,如果您知道一个进程总是需要几秒钟才能启动并运行或完成,这仍然非常有用。

Start-Sleep cmdlet 的工作原理是指定 PowerShell 应等待的时间(以秒或毫秒为单位)。

例如,要让PowerShell等待5秒,我们可以使用:

# Wait for 5 seconds before continuing
Start-Sleep -Seconds 5

等待输入

我还想向您展示的另一种方法是等待 PowerShell 中的输入。有时,让 PowerShell 等待按键后再继续操作会更容易。这可以是任何键输入,也可以是特定键(如果您愿意)。我们有两种等待输入的选项,可以使用 System.Console .Net 类中的 ReadKey 方法,也可以使用 Read-Host 方法。

下面的 ReadKey 方法不会在控制台中返回任何输出(当然除了写入主机),但它在 PowerShell ISE 中不起作用(但我还是建议使用 Visual Studio Code..)

Write-Host "Press any key to continue..."
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null

然而,使用 Read-Host,我们可以指定用户必须按哪个键。这可以更好地控制何时继续脚本。在下面的示例中,我们将 While 循环与 Read-Host cmdlet 结合起来,因此在 PowerShell 继续之前它会一直要求按 Y 键。

while ((Read-Host "Press 'Y' to continue") -ne 'Y') {}

总结

从 PowerShell 启动进程或命令时,最好结合使用 Start-Process cmdlet 和 -Wait 参数。如果进程已在运行,则 Wait-Process cmdlet 是最佳选择。

希望您喜欢这篇文章,如果您有任何疑问,请在下面发表评论。

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

取消回复欢迎 发表评论:

关灯