Start-Job
啟動PowerShell背景工作。
語法
Start-Job
[-Name <String>]
[-ScriptBlock] <ScriptBlock>
[-Credential <PSCredential>]
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Start-Job
[-DefinitionName] <String>
[[-DefinitionPath] <String>]
[[-Type] <String>]
[<CommonParameters>]
Start-Job
[-Name <String>]
[-Credential <PSCredential>]
[-FilePath] <String>
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Start-Job
[-Name <String>]
[-Credential <PSCredential>]
-LiteralPath <String>
[-Authentication <AuthenticationMechanism>]
[[-InitializationScript] <ScriptBlock>]
[-RunAs32]
[-PSVersion <Version>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Description
Start-Job
Cmdlet 會在本機計算機上啟動 PowerShell 背景工作。
PowerShell 背景作業會執行命令,而不需與目前的會話互動。 當您啟動背景作業時,即使作業需要較長的時間才能完成,作業物件也會立即傳回。 您可以在作業執行時繼續在會話中工作,而不會中斷。
作業物件包含作業的實用資訊,但不包含作業結果。
當作業完成時,請使用 Receive-Job
Cmdlet 來取得作業的結果。 如需背景工作的詳細資訊,請參閱 about_Jobs。
若要在遠端電腦上執行背景工作,請使用許多 Cmdlet 上可用的 AsJob 參數,或使用 Invoke-Command
Cmdlet 在遠端電腦上執行 Start-Job
命令。 如需詳細資訊,請參閱 about_Remote_Jobs。
從 PowerShell 3.0 開始,Start-Job
可以啟動自定義作業類型的實例,例如排程的工作。 如需如何使用 Start-Job
以自定義類型啟動作業的資訊,請參閱作業類型功能的說明檔。
作業的預設工作目錄會硬式編碼。 Windows 預設值為 $HOME\Documents
,在 Linux 或 macOS 上,預設值為 $HOME
。 在背景作業中執行的文本程式代碼必須視需要管理工作目錄。
範例
範例 1:啟動背景工作
此範例會啟動在本機計算機上執行的背景工作。
Start-Job -ScriptBlock { Get-Process -Name powershell }
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process -Name powershell
Start-Job
會使用 ScriptBlock 參數,以背景工作的形式執行 Get-Process
。
Name 參數會指定尋找 PowerShell 進程,powershell
。 作業資訊隨即顯示,PowerShell 會在作業在背景中執行時返回提示。
若要檢視作業的輸出,請使用 Receive-Job
Cmdlet。 例如,Receive-Job -Id 1
。
範例 2:使用 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
的工作會建立並儲存在 $jobWRM
變數中。
Invoke-Command
會使用 ComputerName 參數來指定作業執行所在的電腦。
Get-Content
從 C:\Servers.txt
檔案取得伺服器名稱。
ScriptBlock 參數會指定命令,Get-Service
取得 WinRM 服務。
JobName 參數會指定作業的易記名稱,WinRM。
ThrottleLimit 參數會將並行命令數目限制為 16。
AsJob 參數會啟動在伺服器上執行命令的背景作業。
範例 3:取得作業資訊
這個範例會取得作業的相關信息,並顯示本機計算機上執行之已完成作業的結果。
$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 參數會指定星號 (*
) 以顯示所有作業物件的屬性。
範例 4:以背景工作身分執行腳本
在此範例中,本機計算機上的腳本會以背景工作的形式執行。
Start-Job -FilePath C:\Scripts\Sample.ps1
Start-Job
會使用 FilePath 參數來指定儲存在本機電腦上的腳本檔案。
範例 5:使用背景工作取得進程
此範例會使用背景工作,依名稱取得指定的進程。
Start-Job -Name PShellJob -ScriptBlock { Get-Process -Name PowerShell }
Start-Job
會使用 Name 參數來指定易記的工作名稱,PShellJob。
ScriptBlock 參數會指定 Get-Process
,以 PowerShell名稱取得進程。
範例 6:使用背景工作收集和儲存數據
此範例會啟動收集大量地圖數據的作業,然後將它儲存在 .tif
檔案中。
Start-Job -Name GetMappingFiles -InitializationScript {Import-Module -Name MapFunctions} -ScriptBlock {
Get-Map -Name * | Set-Content -Path D:\Maps.tif } -RunAs32
Start-Job
使用 Name 參數來指定易記的工作名稱,GetMappingFiles。
InitializationScript 參數會執行腳本區塊,以匯入 MapFunctions 模組。
ScriptBlock 參數會執行 Get-Map
,Set-Content
將數據儲存在 Path 參數所指定的位置。
RunAs32 參數會以 32 位的形式執行進程,即使在 64 位作系統上也是如此。
範例 7:將輸入傳遞至背景工作
這個範例會使用自動變數 $input
來處理輸入物件。 使用 Receive-Job
來檢視作業的輸出。
Start-Job -ScriptBlock { Get-Content -Path $input } -InputObject "C:\Servers.txt"
Receive-Job -Name Job45 -Keep
Server01
Server02
Server03
Server04
Start-Job
會使用 ScriptBlock 參數,以自動變數執行 $input
Get-Content
。
$input
變數會從 InputObject 參數取得物件。
Receive-Job
會使用 Name 參數來指定作業並輸出結果。
Keep 參數會儲存作業輸出,以便在 PowerShell 工作階段期間再次檢視。
範例 8:使用 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
Start-Job
Cmdlet 會使用 ScriptBlock 參數來執行命令。
Get-Process
會使用 Name 參數來指定自動變數 $args
。
ArgumentList 參數會將行程名稱的陣列傳遞至 $args
。 進程名稱powershell、pwsh和記事本是在本機電腦上執行的處理程式。
若要檢視作業的輸出,請使用 Receive-Job
Cmdlet。 例如,Receive-Job -Id 1
。
參數
-ArgumentList
針對 FilePath 參數或以 ScriptBlock 參數指定的命令所指定的腳本,指定自變數或參數值陣列。
自變數必須傳遞至 ArgumentList 做為單一維度陣列自變數。 例如,以逗號分隔的清單。 如需 ArgumentList行為的詳細資訊,請參閱 about_Splatting。
類型: | Object[] |
別名: | Args |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Authentication
指定用來驗證使用者認證的機制。
此參數可接受的值如下:
- 違約
- 基本
- Credssp
- 消化
- Kerberos
- 談判
- NegotiateWithImplicitCredential
預設值為 Default。
CredSSP 驗證僅適用於 Windows Vista、Windows Server 2008 和更新版本的 Windows作系統。
如需此參數值的詳細資訊,請參閱 AuthenticationMechanism。
謹慎
認證安全性支援提供者 (CredSSP) 驗證,其中使用者的認證會傳遞至要驗證的遠端電腦,其設計訴求是在多個資源上要求驗證的命令,例如存取遠端網路共用。 此機制會增加遠端作業的安全性風險。 如果遠端電腦遭到入侵,傳遞給它的認證可用來控制網路會話。
類型: | AuthenticationMechanism |
接受的值: | Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos |
Position: | Named |
預設值: | Default |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Credential
指定具有執行此動作許可權的用戶帳戶。 如果未指定 Credential 參數,命令會使用目前用戶的認證。
輸入使用者名稱,例如 User01 或 Domain01\User01,或輸入 Get-Credential
Cmdlet 所產生的 PSCredential 物件。 如果您輸入使用者名稱,系統會提示您輸入密碼。
認證會儲存在 PSCredential 物件中,密碼會儲存為 secureString 。
注意
如需 SecureString 數據保護的詳細資訊,請參閱 SecureString 有多安全?。
類型: | PSCredential |
Position: | Named |
預設值: | Current user |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-DefinitionName
指定此 Cmdlet 啟動之作業的定義名稱。 使用此參數啟動具有定義名稱的自定義作業類型,例如排程的工作。
當您使用 Start-Job
啟動排程工作的實例時,不論作業觸發程式或作業選項為何,作業都會立即啟動。 產生的作業實例是排程的作業,但不會像觸發的排程工作一樣儲存到磁碟。 您無法使用 Start-Job
的 ArgumentList 參數,為在排程作業中執行的腳本參數提供值。 如需詳細資訊,請參閱 about_Scheduled_Jobs。
此參數是在 PowerShell 3.0 中引進的。
類型: | String |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-DefinitionPath
指定此 Cmdlet 啟動之作業的定義路徑。 輸入定義路徑。 DefinitionPath 和 DefinitionName 參數的值串連是作業定義的完整路徑。 使用此參數來啟動具有定義路徑的自定義作業類型,例如排程的工作。
針對排程的工作,DefinitionPath 參數的值會 $HOME\AppData\Local\Windows\PowerShell\ScheduledJob
。
此參數是在 PowerShell 3.0 中引進的。
類型: | String |
Position: | 1 |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-FilePath
指定 Start-Job
做為背景作業執行的本機腳本。 輸入文稿的路徑和檔案名,或使用管線將文稿路徑傳送至 Start-Job
。 腳本必須位於本機電腦或本機計算機可以存取的資料夾中。
當您使用此參數時,PowerShell 會將指定腳本檔案的內容轉換成腳本區塊,並以背景工作的形式執行腳本區塊。
類型: | String |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-InitializationScript
指定在作業啟動之前執行的命令。 若要建立腳本區塊,請用大括弧 ({}
) 括住命令。
使用此參數來準備執行作業的會話。 例如,您可以使用它將函式、嵌入式管理單元和模組新增至會話。
類型: | ScriptBlock |
Position: | 1 |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-InputObject
指定命令的輸入。 輸入包含 物件的變數,或輸入產生物件的命令或表達式。
在 ScriptBlock 參數的值中,使用 $input
自動變數來表示輸入物件。
類型: | PSObject |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-LiteralPath
指定此 Cmdlet 以背景工作的形式執行的本機腳本。 輸入本機電腦上的腳本路徑。
Start-Job
會使用 LiteralPath 參數的值,與類型完全相同。 不會將任何字元解譯為通配符。 如果路徑包含逸出字元,請以單引弧括住它。 單引號會告知PowerShell不要將任何字元解譯為逸出序列。
類型: | String |
別名: | PSPath |
Position: | Named |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-Name
指定新作業的易記名稱。 您可以使用名稱來識別作業給其他作業 Cmdlet,例如 Stop-Job
Cmdlet。
默認易記名稱是 Job#
,其中 #
是每個作業遞增的序數。
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-PSVersion
指定版本。
Start-Job
使用 PowerShell 版本執行作業。 這個參數可接受的值為:2.0
和 3.0
。
此參數是在 PowerShell 3.0 中引進的。
類型: | Version |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-RunAs32
表示 Start-Job
在32位進程中執行作業。
RunAs32 會強制作業在 32 位進程中執行,即使在 64 位作系統上也是如此。
在 64 位版本的 Windows 7 和 Windows Server 2008 R2 上,當 Start-Job
命令包含 RunAs32 參數時,您無法使用 Credential 參數來指定其他使用者的認證。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ScriptBlock
指定要在背景作業中執行的命令。 若要建立腳本區塊,請用大括弧 ({}
) 括住命令。 使用 $input
自動變數來存取 InputObject 參數的值。 這是必要參數。
類型: | ScriptBlock |
別名: | Command |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-Type
指定 Start-Job
啟動之作業的自定義類型。 輸入自定義作業類型名稱,例如排程工作的 PSScheduledJob 或工作流程作業的 PSWorkflowJob。 此參數對標準背景作業無效。
此參數是在 PowerShell 3.0 中引進的。
類型: | String |
Position: | 2 |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
輸入
您可以將具有 Name 屬性的物件傳送至這個 Cmdlet Name 參數。 例如,您可以從 Get-ChildItem
使用管線 FileInfo 物件。
輸出
System.Management.Automation.PSRemotingJob
此 Cmdlet 會傳回代表其啟動作業的 PSRemotingJob 物件。
備註
Windows PowerShell 包含下列 Start-Job
別名:
sajb
若要在背景執行,Start-Job
在目前會話的自己的會話中執行。 當您使用 Invoke-Command
Cmdlet 在遠端電腦上的工作階段中執行 Start-Job
命令時,Start-Job
遠端會話中的工作階段中執行。