PowerShell
PowerShellのバックグラウンドジョブ
サーチ…
前書き
ジョブはPowerShell 2.0で導入され、コマンドラインツール固有の問題の解決に役立ちました。簡単に言えば、長時間実行しているタスクを開始すると、タスクが完了するまでプロンプトが表示されなくなります。長時間実行されるタスクの例として、この単純なPowerShellコマンドを考えてみましょう。
Get-ChildItem - パスc:\ - レスキュー
C:ドライブの完全なディレクトリリストを取得するのに時間がかかります。ジョブとして実行すると、コンソールにコントロールが戻され、後で結果を取得できます。
備考
PowerShellジョブは新しいプロセスで実行されます。これには関連する長所と短所があります。
長所:
- ジョブは、環境を含むクリーンなプロセスで実行されます。
- ジョブは、主PowerShellプロセスと非同期で実行できます
短所:
- プロセス環境の変更はジョブには存在しません。
- パラメータは渡され、返された結果は直列化されます。
- つまり、ジョブの実行中にパラメータオブジェクトを変更すると、ジョブに反映されません。
- これは、オブジェクトのシリアル化ができない場合、渡したり返すことができないことを意味します(ただし、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