Start-Job
PowerShell バックグラウンド ジョブを開始します。
構文
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>]
説明
Start-Job
コマンドレットは、ローカル コンピューターで PowerShell バックグラウンド ジョブを開始します。
PowerShell バックグラウンド ジョブは、現在のセッションと対話せずにコマンドを実行します。 バックグラウンド ジョブを開始すると、ジョブの完了に長時間かかる場合でも、ジョブ オブジェクトはすぐに戻ります。 ジョブの実行中に中断することなく、セッションで作業を続けることができます。
ジョブ オブジェクトにはジョブに関する有用な情報が含まれていますが、ジョブの結果は含まれません。
ジョブが完了したら、Receive-Job
コマンドレットを使用してジョブの結果を取得します。 バックグラウンド ジョブの詳細については、about_Jobsを参照してください。
リモート コンピューターでバックグラウンド ジョブを実行するには、多くのコマンドレットで使用できる AsJob パラメーターを使用するか、Invoke-Command
コマンドレットを使用してリモート コンピューターで Start-Job
コマンドを実行します。 詳細については、about_Remote_Jobsを参照してください。
PowerShell 3.0 以降では、Start-Job
は、スケジュールされたジョブなどのカスタム ジョブの種類のインスタンスを開始できます。
Start-Job
を使用してカスタム型でジョブを開始する方法については、ジョブの種類機能のヘルプ ドキュメントを参照してください。
PowerShell 6.0 以降では、アンパサンド (&
) バックグラウンド演算子を使用してジョブを開始できます。 バックグラウンド演算子の機能は、Start-Job
に似ています。 ジョブを開始するどちらのメソッドも、PSRemotingJob ジョブ オブジェクトを作成します。 アンパサンド (&
) の使用方法の詳細については、about_Operatorsを参照してください。
PowerShell 7 では、バックグラウンド ジョブの初期作業ディレクトリを指定する WorkingDirectory パラメーターが導入されました。 パラメーターが指定されていない場合、Start-Job
は、ジョブを開始した呼び出し元の現在の作業ディレクトリに既定で設定されます。
手記
Start-Job
を使用したアウトプロセス バックグラウンド ジョブの作成は、PowerShell Azure Functions などの他のアプリケーションで PowerShell がホストされているシナリオではサポートされていません。
これは、Start-Job
がプロセス外のバックグラウンド ジョブを開始するために $PSHOME
で使用できる pwsh
実行可能ファイルに依存しているためです。ただし、アプリケーションが PowerShell をホストしている場合は、PowerShell NuGet SDK パッケージを直接使用するため、pwsh
一緒に出荷されません。
このシナリオの代わりに、ThreadJob
例
例 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-Process
を実行します。
Name パラメーターは、PowerShell プロセスを検索するように指定 pwsh
。 ジョブ情報が表示され、ジョブがバックグラウンドで実行されている間、PowerShell がプロンプトに戻ります。
ジョブの出力を表示するには、Receive-Job
コマンドレットを使用します。 たとえば、Receive-Job -Id 1
します。
例 2: バックグラウンド・オペレーターを使用してバックグラウンド・ジョブを開始する
この例では、アンパサンド (&
) バックグラウンド演算子を使用して、ローカル コンピューターでバックグラウンド ジョブを開始します。 ジョブは、例 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
。 アンパサンド (&
) は、バックグラウンド ジョブとしてコマンドを実行します。 ジョブ情報が表示され、ジョブがバックグラウンドで実行されている間、PowerShell がプロンプトに戻ります。
ジョブの出力を表示するには、Receive-Job
コマンドレットを使用します。 たとえば、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
を使用するジョブが作成され、$jobWRM
変数に格納されます。
Invoke-Command
では、ComputerName パラメーターを使用して、ジョブを実行するコンピューターを指定します。
Get-Content
は、C:\Servers.txt
ファイルからサーバー名を取得します。
ScriptBlock パラメーターは、WinRM サービスを取得 Get-Service
コマンドを指定します。
例 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 }
例 7: バックグラウンド ジョブを使用してデータを収集して保存する
この例では、大量のマップ データを収集するジョブを開始し、.tif
ファイルに保存します。
Start-Job -Name GetMappingFiles -InitializationScript {Import-Module MapFunctions} -ScriptBlock {
Get-Map -Name * | Set-Content -Path D:\Maps.tif }
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 パラメーターを使用して、$input
自動変数で Get-Content
を実行します。
$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:\Test
です。
Start-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
Start-Job
コマンドレットは、ScriptBlock パラメーターを使用してコマンドを実行します。
Get-Process
では、Name パラメーターを使用して、自動変数 $args
を指定します。
ArgumentList パラメーターは、プロセス名の配列を $args
に渡します。 PowerShell、pwsh、およびメモ帳のプロセス名は、ローカル コンピューターで実行されているプロセスです。
ジョブの出力を表示するには、Receive-Job
コマンドレットを使用します。 たとえば、Receive-Job -Id 1
します。
例 11: 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の動作
型: | Object[] |
Aliases: | Args |
配置: | 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 |
配置: | Named |
規定値: | Default |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Credential
このアクションを実行するアクセス許可を持つユーザー アカウントを指定します。 Credential パラメーターが指定されていない場合、コマンドは現在のユーザーの資格情報を使用します。
User01 や Domain01\User01などのユーザー名を入力するか、Get-Credential
コマンドレットによって生成された PSCredential オブジェクトを入力します。 ユーザー名を入力すると、パスワードの入力を求められます。
資格情報は PSCredential オブジェクトに格納され、パスワードは SecureStringとして格納されます。
手記
SecureString データ保護
型: | PSCredential |
配置: | Named |
規定値: | Current user |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-DefinitionName
このコマンドレットが開始するジョブの定義名を指定します。 スケジュールされたジョブなどの定義名を持つカスタム ジョブの種類を開始するには、このパラメーターを使用します。
Start-Job
を使用してスケジュールされたジョブのインスタンスを開始すると、ジョブ トリガーやジョブ オプションに関係なく、ジョブはすぐに開始されます。 結果のジョブ インスタンスはスケジュールされたジョブですが、トリガーされたスケジュールされたジョブのようにディスクに保存されません。
Start-Job
の ArgumentList パラメーターを使用して、スケジュールされたジョブで実行されるスクリプトのパラメーターの値を指定することはできません。
このパラメーターは PowerShell 3.0 で導入されました。
型: | String |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-DefinitionPath
このコマンドレットが開始するジョブの定義のパスを指定します。 定義パスを入力します。 DefinitionPath パラメーターと DefinitionName パラメーターの値の連結は、ジョブ定義の完全修飾パスです。 スケジュールされたジョブなどの定義パスを持つカスタム ジョブの種類を開始するには、このパラメーターを使用します。
スケジュールされたジョブの場合、DefinitionPath パラメーターの値は $home\AppData\Local\Windows\PowerShell\ScheduledJob
。
このパラメーターは PowerShell 3.0 で導入されました。
型: | String |
配置: | 1 |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-FilePath
バックグラウンド ジョブとして実行 Start-Job
ローカル スクリプトを指定します。 スクリプトのパスとファイル名を入力するか、パイプラインを使用してスクリプト パスを Start-Job
に送信します。 スクリプトは、ローカル コンピューターまたはローカル コンピューターがアクセスできるフォルダーに存在する必要があります。
このパラメーターを使用すると、PowerShell は指定されたスクリプト ファイルの内容をスクリプト ブロックに変換し、スクリプト ブロックをバックグラウンド ジョブとして実行します。
型: | String |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-InitializationScript
ジョブが開始される前に実行されるコマンドを指定します。 スクリプト ブロックを作成するには、コマンドを中かっこ ({}
) で囲みます。
このパラメーターを使用して、ジョブが実行されるセッションを準備します。 たとえば、関数、スナップイン、モジュールをセッションに追加するために使用できます。
型: | ScriptBlock |
配置: | 1 |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-InputObject
コマンドへの入力を指定します。 オブジェクトを含む変数を入力するか、オブジェクトを生成するコマンドまたは式を入力します。
ScriptBlock パラメーターの値で、$input
自動変数を使用して入力オブジェクトを表します。
型: | PSObject |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | True |
ワイルドカード文字を受け取る: | False |
-LiteralPath
このコマンドレットがバックグラウンド ジョブとして実行するローカル スクリプトを指定します。 ローカル コンピューター上のスクリプトのパスを入力します。
Start-Job
では、LiteralPath パラメーターの値が型指定されたとおりに使用されます。 ワイルドカード文字として解釈される文字はありません。 パスにエスケープ文字が含まれている場合は、単一引用符で囲みます。 単一引用符は、エスケープ シーケンスとして文字を解釈しないように PowerShell に指示します。
型: | String |
Aliases: | PSPath, LP |
配置: | Named |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Name
新しいジョブのフレンドリ名を指定します。 この名前を使用して、Stop-Job
コマンドレットなどの他のジョブ コマンドレットにジョブを識別できます。
既定のフレンドリ名は Job#
です。ここで、#
はジョブごとにインクリメントされる序数です。
型: | String |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | True |
ワイルドカード文字を受け取る: | False |
-PSVersion
ジョブの実行に使用する PowerShell のバージョンを指定します。 PSVersion の値が 5.1 の場合 ジョブは Windows PowerShell 5.1 セッションで実行されます。 その他の値の場合、ジョブは現在のバージョンの PowerShell を使用して実行されます。
このパラメーターは PowerShell 7 で追加され、Windows でのみ機能します。
型: | Version |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-RunAs32
PowerShell 7 以降では、RunAs32 パラメーターは 64 ビット PowerShell (pwsh
) では機能しません。
RunAs32 が 64 ビット PowerShell で指定されている場合、Start-Job
は終了例外エラーをスローします。
RunAs32で 32 ビット PowerShell (pwsh
) プロセスを開始するには、32 ビット PowerShell をインストールする必要があります。
32 ビット PowerShell では、RunAs32 は、64 ビット オペレーティング システムでも、32 ビット プロセスでジョブを強制的に実行します。
Windows 7 および Windows Server 2008 R2 の 64 ビット バージョンでは、Start-Job
コマンドに RunAs32 パラメーターが含まれている場合、Credential パラメーターを使用して別のユーザーの資格情報を指定することはできません。
型: | SwitchParameter |
配置: | Named |
規定値: | False |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-ScriptBlock
バックグラウンド ジョブで実行するコマンドを指定します。 スクリプト ブロックを作成するには、コマンドを中かっこ ({}
) で囲みます。
$input
自動変数を使用して、InputObject パラメーターの値にアクセスします。 このパラメーターは必須です。
型: | ScriptBlock |
Aliases: | Command |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Type
Start-Job
によって開始されるジョブのカスタム型を指定します。 スケジュールされたジョブの場合は PSScheduledJob、ワークフロー ジョブの場合は PSWorkflowJob など、カスタム ジョブの種類名を入力します。 このパラメーターは、標準のバックグラウンド ジョブでは無効です。
このパラメーターは PowerShell 3.0 で導入されました。
型: | String |
配置: | 2 |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-WorkingDirectory
バックグラウンド ジョブの初期作業ディレクトリを指定します。 パラメーターが指定されていない場合、ジョブは既定の場所から実行されます。 既定の場所は、ジョブを開始した呼び出し元の現在の作業ディレクトリです。
このパラメーターは PowerShell 7 で導入されました。
型: | String |
配置: | Named |
規定値: | $HOME on Unix (macOS, Linux) and $HOME\Documents on Windows |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
入力
パイプラインを使用して、Name プロパティを持つオブジェクトを Name パラメーターに送信できます。 たとえば、FileInfo オブジェクトを Get-ChildItem
から Start-Job
にパイプライン化できます。
出力
System.Management.Automation.PSRemotingJob
Start-Job
は、開始したジョブを表す PSRemotingJob オブジェクトを返します。
メモ
バックグラウンドで実行するには、Start-Job
は現在のセッション内の独自のセッションで実行されます。
Invoke-Command
コマンドレットを使用してリモート コンピューター上のセッションで Start-Job
コマンドを実行すると、Start-Job
リモート セッション内のセッションで実行されます。