← Back to Home

PowerShellのジョブシステムを使用した長時間のタスク

Views: 1008

You can try the commands on our interactive shell.

PowerShellのジョブシステムを使用した長時間のタスク

PowerShellのジョブシステムは、コンソールや他のスクリプトをブロックせずに長時間のタスクを背景で実行する強力な機能です。このチュートリアルでは、PowerShellのジョブシステムを使用して長時間のタスクを実行し、ベストプラクティスについて学習します。

ジョブシステムとは?


ジョブシステムは、PowerShell 3以降で導入された機能です。これにより、コマンドを非同期に実行することができます。これは、ジョブを開始すると、背景で実行されるため、コンソールや他のスクリプトがブロックされません。ジョブは、データ処理、バックアップ、ネットワークオペレーションなど長時間のタスクに向いています。

ジョブの開始


ジョブを開始するには、Start-Job cmdletを使用して、非同期に実行したいコマンドを指定します。例えば:

$job = Start-Job { Get-ChildItem -Path C:\ -Recurse }

この例では、Cドライブのrootディレクトリー全体のファイルとディレクトリーをリストするために、Get-ChildItem cmdletを使用しています。

ジョブの操作


ジョブを開始したら、以下のcmdletsを使用してジョブを操作できます。

以下は、这些cmdletsを使用した例です:

# ジョブを開始
$job = Start-Job { Get-ChildItem -Path C:\ -Recurse }

# ジョブについて情報を取得
Get-Job -Id $job.Id

# ジョブから出力を受け取り
Receive-Job -Job $job

# ジョブを停止
Stop-Job -Job $job

ベストプラクティス


ジョブシステムに関するベストプラクティスとして、以下の点に注意してください。

スクリプト例:大きな CSV ファイルの処理


以下は、大きな CSV ファイルを処理するためのスクリプトの例です:

# 処理するファンの定義
function Process-CsvFile {
  param ($file)

  # CSV ファイルを PSObject にロード
  $data = Import-Csv -Path $file.FullName

  # データを処理...
  foreach ($row in $data) {
    Write-Host "Processing: $($row.Name)"
    # ...エラーをログに残す...
    if ($row.Error) {
      Write-Warning "Error: $($row.Error)"
    }
  }

  # 処理されたデータの出力
  Write-Output $data | Export-Csv -Path (Join-Path -Path $file.DirectoryName -ChildPath "processed.csv")
}

# CSV ファイルを取得
$files = Get-ChildItem -Path C:\ -Filter *.csv -Recurse

# ジョブを開始する
foreach ($file in $files) {
  Start-Job { Process-CsvFile -file $using:file } -Name "Process-$($file.Name)"
}

# ジョブの進行状況をモニターし、出力を受け取り
Get-Job | Receive-Job | Out-Null

このスクリプトでは、CSV ファイルを処理するための関数 Process-CsvFile を定義しています。この関数は、指定された CSV ファイルを読み込み、その内容を処理します。次に、各 CSV ファイルについてジョブを開始し、ジョブの進行状況をモニターし、出力を受け取ります。

結論


PowerShell のジョブシステムは、長時間のタスクを背景で実行する強力な機能です。この機能を使用して、robust 且つ効率的なスクリプトを書くことができます。

Try it Now!