共用方式為


Start-Job

啟動PowerShell背景作業。

Syntax

Start-Job
     [-Name <String>]
     [-ScriptBlock] <ScriptBlock>
     [-Credential <PSCredential>]
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-WorkingDirectory <String>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]
Start-Job
     [-DefinitionName] <String>
     [[-DefinitionPath] <String>]
     [[-Type] <String>]
     [-WorkingDirectory <String>]
     [<CommonParameters>]
Start-Job
     [-Name <String>]
     [-Credential <PSCredential>]
     [-FilePath] <String>
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-WorkingDirectory <String>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]
Start-Job
     [-Name <String>]
     [-Credential <PSCredential>]
     -LiteralPath <String>
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-WorkingDirectory <String>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]

Description

Cmdlet Start-Job 會在本機計算機上啟動 PowerShell 背景工作。

PowerShell 背景作業會執行命令,而不需與目前的會話互動。 當您啟動背景作業時,即使作業需要很久才完成,也會立即傳回作業物件。 工作執行時,您可以在工作階段中繼續工作,而不需中斷。

作業物件包含作業的實用資訊,但不包含作業結果。 當作業完成時,請使用 Receive-Job Cmdlet 來取得作業的結果。 如需背景工作的詳細資訊,請參閱 about_Jobs

若要在遠端電腦上執行背景工作,請使用許多 Cmdlet 上可用的 AsJob 參數,或使用 Invoke-Command Cmdlet 在遠端電腦上執行 Start-Job 命令。 如需詳細資訊,請參閱 about_Remote_Jobs

從 PowerShell 3.0 開始, Start-Job 可以啟動自定義作業類型的實例,例如已排程的作業。 如需如何以 Start-Job 自定義類型啟動作業的詳細資訊,請參閱作業類型功能的說明檔。

從 PowerShell 6.0 開始,您可以使用 ampersand (&) 背景運算符來啟動作業。 背景運算子的功能類似於 Start-Job。 啟動作業的兩種方法都會建立 PSRemotingJob 作業物件。 如需使用 ampersand () & 的詳細資訊,請參閱 about_Operators

PowerShell 7 引進 了 WorkingDirectory 參數,指定背景工作的初始工作目錄。 如果未指定 參數, Start-Job 預設為啟動作業之呼叫端的目前工作目錄。

注意

在 PowerShell 裝載於其他應用程式中的案例中,不支援使用 建立同進程背景工作Start-Job,例如 PowerShell Azure Functions。

這是設計方式,因為 Start-Job 取決於 pwsh 可用的 $PSHOME 可執行檔來啟動跨進程背景工作,但是當應用程式裝載 PowerShell 時,它會直接使用 PowerShell NuGet SDK 套件,而且不會 pwsh 一併隨附。

該案例中的替代項目來自 Start-ThreadJobThreadJob 模組。

範例

範例 1:啟動背景工作

本範例會啟動在本機計算機上執行的背景作業。

Start-Job -ScriptBlock { Get-Process -Name pwsh }

Id  Name   PSJobTypeName   State     HasMoreData   Location    Command
--  ----   -------------   -----     -----------   --------    -------
1   Job1   BackgroundJob   Running   True          localhost   Get-Process -Name pwsh

Start-Job 會使用 ScriptBlock 參數以背景作業的形式執行 Get-ProcessName 參數會指定尋找 PowerShell 行程 pwsh 作業資訊隨即顯示,PowerShell 會在作業在背景中執行時返回提示。

若要檢視作業的輸出,請使用 Receive-Job Cmdlet。 例如: Receive-Job -Id 1

範例 2:使用背景運算符啟動背景作業

此範例會使用 ampersand (&) 背景運算符,在本機計算機上啟動背景工作。 作業會取得與範例 1 相同的結果 Start-Job

Get-Process -Name pwsh &

Id    Name   PSJobTypeName   State       HasMoreData     Location      Command
--    ----   -------------   -----       -----------     --------      -------
5     Job5   BackgroundJob   Running     True            localhost     Microsoft.PowerShell.Man...

Get-Process使用 Name 參數來指定 PowerShell 進程。 pwsh ampersand () & 以背景作業的形式執行命令。 作業資訊隨即顯示,PowerShell 會在作業在背景中執行時返回提示。

若要檢視作業的輸出,請使用 Receive-Job Cmdlet。 例如: Receive-Job -Id 5

範例 3:使用 Invoke-Command 啟動作業

本範例會在多部計算機上執行作業。 作業會儲存在變數中,並使用PowerShell命令行上的變數名稱來執行。

$jobWRM = Invoke-Command -ComputerName (Get-Content -Path C:\Servers.txt) -ScriptBlock {
   Get-Service -Name WinRM } -JobName WinRM -ThrottleLimit 16 -AsJob

使用的 Invoke-Command 作業會建立並儲存在變數中 $jobWRMInvoke-Command 會使用 ComputerName 參數來指定作業執行所在的電腦。 Get-Content 會從 C:\Servers.txt 檔案取得伺服器名稱。

ScriptBlock 參數會指定取得 WinRM 服務的命令Get-ServiceJobName 參數會指定作業 WinRM 的易記名稱。 ThrottleLimit 參數會將並行命令數目限制為 16。 AsJob 參數會啟動在伺服器上執行命令的背景作業。

範例 4:取得作業資訊

本範例會取得作業的相關信息,並顯示本機計算機上執行之已完成作業的結果。

$j = Start-Job -ScriptBlock { Get-WinEvent -Log System } -Credential Domain01\User01
$j | Select-Object -Property *

State         : Completed
HasMoreData   : True
StatusMessage :
Location      : localhost
Command       : Get-WinEvent -Log System
JobStateInfo  : Completed
Finished      : System.Threading.ManualResetEvent
InstanceId    : 27ce3fd9-40ed-488a-99e5-679cd91b9dd3
Id            : 18
Name          : Job18
ChildJobs     : {Job19}
PSBeginTime   : 8/8/2019 14:41:57
PSEndTime     : 8/8/2019 14:42:07
PSJobTypeName : BackgroundJob
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
Information   : {}

Start-Job 會使用 ScriptBlock 參數來執行命令,指定 Get-WinEvent 取得 系統 記錄檔。 Credential 參數會指定具有在計算機上執行作業許可權的網域用戶帳戶。 作業物件會儲存在變數中 $j

變數中的 $j 物件會向下傳送至 管線。Select-Object Property 參數會指定星號 () * 來顯示所有作業對象的屬性。

範例 5:以背景工作身分執行腳本

在此範例中,本機計算機上的腳本會以背景工作的形式執行。

Start-Job -FilePath C:\Scripts\Sample.ps1

Start-Job 會使用 FilePath 參數來指定儲存在本機電腦上的腳本檔案。

範例 6:使用背景工作取得進程

此範例會使用背景工作依名稱取得指定的進程。

Start-Job -Name PShellJob -ScriptBlock { Get-Process -Name PowerShell }

Start-Job 會使用 Name 參數來指定易記的作業名稱 PShellJobScriptBlock 參數會Get-Process指定以 PowerShell 名稱取得進程。

範例 7:使用背景工作收集及儲存數據

本範例會啟動收集大量地圖數據的作業,然後將它儲存在檔案中 .tif

Start-Job -Name GetMappingFiles -InitializationScript {Import-Module MapFunctions} -ScriptBlock {
   Get-Map -Name * | Set-Content -Path D:\Maps.tif }

Start-Job 會使用 Name 參數來指定易記的工作名稱 GetMappingFilesInitializationScript 參數會執行匯入 MapFunctions 模組的腳本區塊。 ScriptBlock 參數會執行Get-Map,並將Set-Content數據儲存在 Path 參數所指定的位置。

範例 8:將輸入傳遞至背景工作

這個範例會 $input 使用自動變數來處理輸入物件。 用來 Receive-Job 檢視作業的輸出。

Start-Job -ScriptBlock { Get-Content $input } -InputObject "C:\Servers.txt"
Receive-Job -Name Job45 -Keep

Server01
Server02
Server03
Server04

Start-Job會使用 ScriptBlock 參數搭配自動變數執行Get-Content$input。 變數 $input 會從 InputObject 參數取得物件。 Receive-Job 會使用 Name 參數來指定作業並輸出結果。 Keep 參數會儲存作業輸出,以便在 PowerShell 工作階段期間再次檢視。

範例 9:設定背景工作的工作目錄

WorkingDirectory 可讓您為可執行腳本或開啟檔案的作業指定替代目錄。 在此範例中,背景作業會指定與目前目錄位置不同的工作目錄。

PS C:\Test> Start-Job -WorkingDirectory C:\Test\Scripts { $PWD } | Receive-Job -AutoRemoveJob -Wait

Path
----
C:\Test\Scripts

這個範例的目前工作目錄為 C:\TestStart-Job 會使用 WorkingDirectory 參數來指定作業的工作目錄。 ScriptBlock 參數會使用 $PWD 來顯示作業的工作目錄。 Receive-Job 會顯示背景作業的輸出。 AutoRemoveJob 會刪除作業, 並等候 會隱藏命令提示字元,直到收到所有結果為止。

範例 10:使用 ArgumentList 參數來指定陣列

這個範例會使用 ArgumentList 參數來指定自變數的陣列。 陣列是以逗號分隔的進程名稱清單。

Start-Job -ScriptBlock { Get-Process -Name $args } -ArgumentList powershell, pwsh, notepad

Id     Name      PSJobTypeName   State       HasMoreData     Location     Command
--     ----      -------------   -----       -----------     --------     -------
1      Job1      BackgroundJob   Running     True            localhost    Get-Process -Name $args

Cmdlet Start-Job 會使用 ScriptBlock 參數來執行命令。 Get-Process 使用 Name 參數來指定自動變數 $argsArgumentList 參數會將行程名稱的陣列傳遞至 $args。 進程名稱powershell、pwsh和記事本是在本機電腦上執行的處理程式。

若要檢視作業的輸出,請使用 Receive-Job Cmdlet。 例如: Receive-Job -Id 1

範例 11:在 Windows PowerShell 5.1 中執行作業

此範例使用值為 5.1PSVersion 參數,在 Windows PowerShell 5.1 會話中執行作業。

$PSVersionTable.PSVersion

Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
7      0      0      rc.1

$job = Start-Job { $PSVersionTable.PSVersion } -PSVersion 5.1
Receive-Job $job

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14393  3383

參數

-ArgumentList

針對 FilePath 參數所指定的腳本,或以 ScriptBlock 參數指定的命令,指定自變數或參數值的陣列。

自變數必須傳遞至 ArgumentList 做為單一維度陣列自變數。 例如,以逗號分隔的清單。 如需 ArgumentList 行為的詳細資訊,請參閱 about_Splatting

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Authentication

指定用來驗證使用者認證的機制。

此參數可接受的值如下所示:

  • Default
  • 基本資訊
  • Credssp
  • Digest
  • Kerberos
  • 交涉
  • NegotiateWithImplicitCredential

預設值為 Default。

CredSSP 驗證僅適用於 Windows Vista、Windows Server 2008 和更新版本的 Windows 操作系統。

如需此參數值的詳細資訊,請參閱 AuthenticationMechanism

警告

使用者認證會傳遞至要驗證之遠端電腦的「認證安全性支援提供者 (CredSSP)」驗證,是設計用於需要在一個以上資源進行驗證的命令,例如存取遠端網路共用。 此機制會使得遠端作業的安全性風險變高。 若遠端電腦遭到入侵,傳遞給它的認證便可用來控制網路工作階段。

Type:AuthenticationMechanism
Accepted values:Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos
Position:Named
Default value:Default
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Credential

指定具有執行此動作權限的使用者帳戶。 如果未指定 Credential 參數,命令會使用目前用戶的認證。

輸入用戶名稱,例如User01Domain01\User01,或輸入 Cmdlet 所產生的 Get-CredentialPSCredential 物件。 如果您輸入使用者名稱,系統會提示您輸入密碼。

認證會儲存在 PSCredential 物件中,密碼會儲存為 SecureString

注意

如需 SecureString 數據保護的詳細資訊,請參閱 SecureString 有多安全?

Type:PSCredential
Position:Named
Default value:Current user
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DefinitionName

指定此 Cmdlet 啟動之作業的定義名稱。 使用這個參數來啟動具有定義名稱的自訂工作類型,例如已排程的工作。

當您用來 Start-Job 啟動排程工作的實例時,不論作業觸發程式或作業選項為何,作業都會立即啟動。 產生的作業實例是排程的工作,但不會儲存到磁碟,例如觸發的排程工作。 您無法使用的 Start-JobArgumentList 參數,為在排程作業中執行的腳本參數提供值。

此參數是在 PowerShell 3.0 中引進。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-DefinitionPath

指定此 Cmdlet 啟動之作業的定義路徑。 輸入定義路徑。 DefinitionPathDefinitionName 參數值的串連是作業定義的完整路徑。 使用這個參數來啟動具有定義路徑的自訂工作類型,例如已排程的工作。

針對排程的工作, DefinitionPath 參數的值是 $home\AppData\Local\Windows\PowerShell\ScheduledJob

此參數是在 PowerShell 3.0 中引進。

Type:String
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

指定以背景作業身分執行的本機腳本 Start-Job 。 輸入文稿的路徑和檔案名,或使用管線將文稿路徑傳送至 Start-Job。 腳本必須位於本機電腦或本機計算機可存取的資料夾中。

當您使用此參數時,PowerShell 會將指定腳本檔案的內容轉換為腳本區塊,並以背景工作的形式執行腳本區塊。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

指定要在工作開始之前執行的命令。 若要建立腳本區塊,請將命令括在大括弧 ({}) 中。

使用這個參數來準備執行工作的工作階段。 例如,您可以使用它來新增函式、嵌入式管理單元和模組到工作階段。

Type:ScriptBlock
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定命令的輸入。 輸入包含物件的變數,或輸入可產生物件的命令或運算式。

ScriptBlock 參數的值中,使用 $input 自動變數來表示輸入物件。

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-LiteralPath

指定此 Cmdlet 以背景作業的形式執行的本機腳本。 在本機計算機上輸入文本的路徑。

Start-Job 會使用 LiteralPath 參數的值,與其類型完全相同。 沒有字元會被視為萬用字元。 如果路徑包含逸出字元,請將它括在單引號中。 單引號會告訴PowerShell不要將任何字元解譯為逸出序列。

Type:String
Aliases:PSPath, LP
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Name

指定新工作的好記名稱。 您可以使用名稱來識別作業給其他作業 Cmdlet,例如 Stop-Job Cmdlet。

默認易記名稱為 Job#,其中 # 是每個作業遞增的序數。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-PSVersion

指定要用於執行作業的 PowerShell 版本。 當 PSVersion 的值是 5.1 時,作業會在 Windows PowerShell 5.1 會話中執行。 針對任何其他值,作業會使用目前版本的PowerShell來執行。

此參數已在PowerShell 7中新增,僅適用於Windows。

Type:Version
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RunAs32

從 PowerShell 7 開始, RunAs32 參數不適用於 64 位 PowerShell () pwsh 。 如果在64位PowerShell中指定 RunAs32Start-Job 則會擲回終止例外狀況錯誤。 若要使用 RunAs32 啟動 32 位 PowerShell (pwsh) 程式,您必須安裝 32 位 PowerShell。

在 32 位 PowerShell 中, RunAs32 會強制作業在 32 位進程中執行,即使在 64 位作業系統上也是如此。

在 64 位版本的 Windows 7 和 Windows Server 2008 R2 上,當命令包含 RunAs32 參數時Start-Job,您無法使用 Credential 參數來指定其他使用者的認證。

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

指定要在背景工作執行的命令。 若要建立腳本區塊,請將命令括在大括弧 ({}) 中。 $input使用自動變數來存取 InputObject 參數的值。 此為必要參數。

Type:ScriptBlock
Aliases:Command
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Type

指定 由 Start-Job啟動之作業的自定義類型。 輸入自訂工作類型名稱,例如,已排程工作的 PSScheduledJob 或工作流程工作的 PSWorkflowJob。 此參數對標準背景工作無效。

此參數是在 PowerShell 3.0 中引進。

Type:String
Position:2
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WorkingDirectory

指定背景作業的初始工作目錄。 如果未指定 參數,作業會從預設位置執行。 預設位置是啟動作業之呼叫端的目前工作目錄。

此參數是在 PowerShell 7 中引進的。

Type:String
Position:Named
Default value:$HOME on Unix (macOS, Linux) and $HOME\Documents on Windows
Required:False
Accept pipeline input:False
Accept wildcard characters:False

輸入

String

您可以使用管線,將 具有 Name 屬性的物件傳送至 Name 參數。 例如,您可以將 FileInfo 物件從 Get-ChildItem 管線傳送至 Start-Job

輸出

System.Management.Automation.PSRemotingJob

Start-Job 會傳回 PSRemotingJob 物件,代表它啟動的作業。

備註

若要在背景中執行, Start-Job 請在目前會話的自己的會話中執行。 當您使用 Invoke-Command Cmdlet 在遠端電腦上的工作階段中執行 Start-Job 命令時, Start-Job 請在遠端工作階段中的作業階段中執行。