如何在后台运行 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