如何在后台运行 PowerShell 命令?


要在 PowerShell 中后台运行命令,需要使用后台作业 cmdlet。后台作业表示在后台运行命令/作业,而不会占用控制台。

Start-Job 是 PowerShell 的作业调度程序 cmdlet 之一,它在后台运行 PowerShell 命令,而不会与当前用户会话交互作为作业,以便用户可以在 PowerShell 控制台中工作,而不会在命令在后台运行时失去对控制台的控制。

当 PowerShell 的作业使用 Start-Job 启动时,即使作业需要较长时间,作业也会立即返回对象。

Start-Job 旨在在本地计算机上运行,因为它没有远程作业参数。要远程运行作业,需要使用带有 -AsJob 参数的 Invoke-Command。

示例

Start-Job -ScriptBlock{Get-EventLog -LogName System}

运行命令后,以下输出将立即生成。

输出

Id    Name    PSJobTypeName    State    HasMoreData    Location
--    ----    -------------    -----    -----------    --------
1    Job1    BackgroundJob    Running       True      localhost

如果查看以上输出,作业状态为正在运行。在脚本块中指定的命令越多,在后台运行的 PowerShell 作业就越多,消耗的内存就越多。

要运行多个命令,

Start-Job -ScriptBlock{Get-EventLog -LogName System; Get-Process}

您还可以使用 Invoke-Command 在后台使用 -AsJob 参数运行作业。由于 InvokeCommand 旨在在远程计算机上运行命令,因此您可以为远程服务器运行后台作业。

示例

$sb = {Get-EventLog -LogName System; Get-Process}
Invoke-Command -ComputerName Test1-Win2k16,Test1-Win2k12 -ScriptBlock $sb -AsJob

输出

您还可以使用 -JobName 参数指定作业的名称。

$sb = {Get-EventLog -LogName System; Get-Process}
Invoke-Command -ComputerName Test1-Win2k16,Test1-Win2k12 -ScriptBlock $sb -
AsJob -JobName NewJob

输出

要检查作业状态,请使用 Get-Job 命令。

Id    Name    PSJobTypeName    State    HasMoreData    Location
--    ----    -------------    -----    -----------    --------
21    NewJob    RemoteJob      Running    True       Test1-Win2k16,Te

以上输出已截断。

每个作业至少有一个父作业和一个子作业。在后台运行的子作业的数量取决于远程计算机的数量。要获取所有子作业,请在 Get-Job cmdlet 中使用 -IncludeChildJob 参数。

示例

Get-Job -IncludeChildJob

输出

Id    Name    PSJobTypeName    State    HasMoreData    Location
--    ----    -------------    -----    -----------    --------
21    NewJob    RemoteJob    Completed    True       Test1-Win2k16,T...
22    Job22                  Completed    True       Test1-Win2k16
23    Job23                  Completed    True       Test1-Win2k12

在我们运行上述命令时,作业已完成,并且可以在 State 属性中看到。这里 22 和 23 作业 ID 是在远程计算机上运行的子作业,而 21 是父作业。

要立即在作业调度后获取作业输出,可以使用 Receive-Job 命令。即使作业状态为正在运行,也可以运行此命令。

需要将 Receive-Job 命令与具有名称、ID、作业名称变量或任何其他受支持参数的作业一起使用。

示例

Start-Job -Command {Get-Service Spooler, W32Time}
Receive-Job -Name Job5

要使用 ID 检索作业,

Receive-Job -ID 5

更新于: 2020年9月3日

14K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告