如何在後臺執行 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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告
© . All rights reserved.