Parallel

PowerShell 6以前

PowerShell 7以降

ForEach?-Object -Parallel

  • ForEach?-Object -Parallelを利用するにはPowerShell 7 Preview.3以降の環境が必要

Job

Start-Job

Get-Job

Receive-Job

ThreadJob

同時実行数制御

SplitPipeline

Process

Start-Process

Start-Process 
    -FilePath [実行ファイルのパス] 
    -ArgumentList [引数リスト] 
    -NoNewWindow 
    -Wait
    -PassThru
    -WorkingDirectory [プロセスの開始フォルダ]
    -Verb [動詞]  ※Windowsでのみ機能

PassThru?

  • コマンドレットが開始した各プロセスのプロセスオブジェクトを返す
  • Wait-Process, Stop-Process で制御する場合は付ける

Verbパラメタ

  • Verbパラメータについてもっと知りたい
  • .exe
    • Open(開く)
    • RunAs?(管理者権限で実行)
    • RunAsUser?(別のユーザとして実行)
  • .cmd
    • Edit(編集)
    • Open(開く)
    • Print(印刷)
    • RunAs?(管理者権限で実行)
    • RunAsUser?(別のユーザとして実行)
  • .txt
    • Open(開く)
    • Print(印刷)

Wait-Process

パターン1(プロセス名で指定)

-Name <プロセス名>
-Timeout <タイムアウト時間>

パターン2(プロセスIDで指定)

-Id <プロセスID>
-Timeout <タイムアウト時間>

パターン3(オブジェクトで指定)

-Timeout <タイムアウト時間>
-InputObject <プロセスオブジェクト>

Stop-Process

パターン3(オブジェクトで指定)

[-InputObject] <Process[]>
[-PassThru]
[-Force]
[-WhatIf]
[-Confirm]
[<CommonParameters>]

テストプログラム

# プロセスオブジェクトを格納
$processList = New-Object System.Collections.Generic.List[System.Diagnostics.Process]

# メモ帳を3つ起動
for ($i=0; $i -lt 3; $i++) {
	$obj = Start-Process -FilePath notepad -PassThru
	$processList.Add($obj)
}

# メモ帳3つが終了するのを待つ(タイムアウト 30秒)
#
# ※メモ帳は手動で停止
# ※タイムアウトが発生した場合は強制終了
#
try {
	Wait-Process -InputObject $processList -Timeout 30
}
catch {
	# タイムアウトしてもここには来ないので、下記は実行されない
	Stop-Process -InputObject $processList -Force
}
finally {
	# 終了していないプロセスを強制終了
	Stop-Process -InputObject $processList -Force
	
	# プロセスが終了したことを確認
	Get-Process -InputObject $processList
}

Workflow

  • PowerShell Core からはサポートされなくなった機能

その他


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-07 (火) 16:26:33 (871d)