サーチ…


前書き

ジョブはPowerShell 2.0で導入され、コマンドラインツール固有の問題の解決に役立ちました。簡単に言えば、長時間実行しているタスクを開始すると、タスクが完了するまでプロンプトが表示されなくなります。長時間実行されるタスクの例として、この単純なPowerShellコマンドを考えてみましょう。

Get-ChildItem - パスc:\ - レスキュー

C:ドライブの完全なディレクトリリストを取得するのに時間がかかります。ジョブとして実行すると、コンソールにコントロールが戻され、後で結果を取得できます。

備考

PowerShellジョブは新しいプロセスで実行されます。これには関連する長所と短所があります。

長所:

  1. ジョブは、環境を含むクリーンなプロセスで実行されます。
  2. ジョブは、主PowerShellプロセスと非同期で実行できます

短所:

  1. プロセス環境の変更はジョブには存在しません。
  2. パラメータは渡され、返された結果は直列化されます。
    • つまり、ジョブの実行中にパラメータオブジェクトを変更すると、ジョブに反映されません。
    • これは、オブジェクトのシリアル化ができない場合、渡したり返すことができないことを意味します(ただし、PowerShellはパラメータをコピーしてPSObjectを返すことがあります)。

基本的なジョブの作成

バックグラウンドジョブとしてスクリプトブロックを開始する:

$job = Start-Job -ScriptBlock {Get-Process}

バックグラウンドジョブとしてスクリプトを開始する:

$job = Start-Job -FilePath "C:\YourFolder\Script.ps1"

リモートマシンでInvoke-Commandを使用してジョブを開始する:

$job = Invoke-Command -ComputerName "ComputerName" -ScriptBlock {Get-Service winrm} -JobName "WinRM" -ThrottleLimit 16 -AsJob

別のユーザーとしてジョブを開始する(パスワードを求めるプロンプト):

Start-Job -ScriptBlock {Get-Process} -Credential "Domain\Username"

または

Start-Job -ScriptBlock {Get-Process} -Credential (Get-Credential)

ジョブを別のユーザーとして開始する(プロンプトなし):

$username = "Domain\Username" 
$password = "password"
$secPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username, $secPassword)
Start-Job -ScriptBlock {Get-Process} -Credential $credentials

基本的なジョブ管理

現在のセッション内のすべてのジョブのリストを取得します。

Get-Job

ジョブを待って結果を得る前に終了する:

$job | Wait-job | Receive-Job 

実行時間が長すぎる場合はジョブのタイムアウト(この例では10秒)

$job | Wait-job -Timeout 10

ジョブを停止する(終了する前にそのジョブキューで保留中のすべてのタスクを完了する)。

$job | Stop-Job 

現在のセッションのバックグラウンドジョブリストからジョブを削除する:

$job | Remove-Job

:以下は、 Workflowジョブでのみ機能します。

Workflowジョブを中断する(一時停止):

$job | Suspend-Job 

Workflowジョブを再開する:

$job | Resume-Job 


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow