#author("2021-12-07T04:42:48+00:00","default:admin","admin") #author("2021-12-07T07:26:33+00:00","default:admin","admin") *Parallel [#hf9b3efa] **PowerShell 6以前 [#qf3281e9] -[[PowerShell で並列処理を試してみた:https://qiita.com/miyamiya/items/50219b5fdab701e56576]] -[[PowerShell 3.0 の ForEach –parallel はマルチスレッドではない:https://blog.kuma.icu/2012/12/powershell-30-foreach-parallel.html]] -[[PowerShell による同期処理、非同期処理、並列処理 を考えてみる:https://tech.guitarrapc.com/entry/2013/10/29/100946]] **PowerShell 7以降 [#o5091448] ***ForEach-Object -Parallel [#n994ebb0] -[[Foreach Parallel を使用した複数のスレッド間での進行状況の書き込み:https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/write-progress-across-multiple-threads?view=powershell-7.2]] -[[[PowerShell] ForEach-Objectの新機能、ForEach-Object -Parallel について:https://dev.classmethod.jp/articles/about-powershell-foreach-object-parallel/]] -[[PowerShell 7.0.0 Preview3新機能 ForEach-Object並列処理]] -[[PowerShell 7.0.0 Preview3新機能 ForEach-Object並列処理 (2):https://news.mynavi.jp/itsearch/article/hardware/4632]] -ForEach-Object -Parallelを利用するにはPowerShell 7 Preview.3以降の環境が必要 *Job [#lbc70076] -[[PowerShell - Background Jobs, Runspace Jobs, and Thread Jobs:https://randombrainworks.com/2018/01/29/powershell-background-jobs-runspace-jobs-thread-jobs/]] -[[PowerShell: 複数の異なるタスクを並行稼働させる:https://blog.yamk.net/posts/20200725-ps1backgroundjob/]] -[[PowerShellで並列処理して遊ぶ:https://sanpobiyori.info/63/]] -[[[PowerShell]Start-Jobで共通の関数を使う:https://qiita.com/Kamo123/items/940910502671d1c195da]] **Start-Job [#v317da86] **Get-Job [#i4b207dc] **Receive-Job [#k3e4cfa0] **[[ThreadJob:https://www.powershellgallery.com/packages/ThreadJob/]] [#dc362217] -[[PowerShell Core 6.1で導入されるThreadJobについて:https://blog.shibata.tech/entry/2018/09/05/175647]] **同時実行数制御 [#j663beb5] -[[PowerShellでN個の並列ジョブを実行する:https://www.webdevqa.jp.net/ja/powershell/powershell%E3%81%A7n%E5%80%8B%E3%81%AE%E4%B8%A6%E5%88%97%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/940865034/]] -[[Run N parallel jobs in powershell:https://stackoverflow.com/questions/8781666/run-n-parallel-jobs-in-powershell]] -[[同時に10個までのjobを実行するように制御する方法とパイプラインについて:https://or1ko.hatenablog.com/entry/2012/12/05/001208]] ***[[SplitPipeline:https://github.com/nightroman/SplitPipeline]] [#t32dec4d] -[[SplitPipeline - NuGet:https://www.nuget.org/packages/SplitPipeline/]] -[[Powershell:複数のジョブを並行して実行し、バックグラウンドジョブのストリーミング結果を表示します:https://www.webdevqa.jp.net/ja/powershell/powershell%ef%bc%9a%e8%a4%87%e6%95%b0%e3%81%ae%e3%82%b8%e3%83%a7%e3%83%96%e3%82%92%e4%b8%a6%e8%a1%8c%e3%81%97%e3%81%a6%e5%ae%9f%e8%a1%8c%e3%81%97%e3%80%81%e3%83%90%e3%83%83%e3%82%af%e3%82%b0%e3%83%a9%e3%82%a6%e3%83%b3%e3%83%89%e3%82%b8%e3%83%a7%e3%83%96%e3%81%ae%e3%82%b9%e3%83%88%e3%83%aa%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0%e7%b5%90%e6%9e%9c%e3%82%92%e8%a1%a8%e7%a4%ba%e3%81%97%e3%81%be%e3%81%99/1072787173/]] *Process [#e3aedee1] -[[Process コマンドレットによるプロセスの管理:https://docs.microsoft.com/ja-jp/powershell/scripting/samples/managing-processes-with-process-cmdlets?view=powershell-7.2]] -[[次のコマンドを開始する前に、各コマンドの終了を待つようにPowerShellに指示する方法:https://www.webdevqa.jp.net/ja/powershell/%E6%AC%A1%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E3%80%81%E5%90%84%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E7%B5%82%E4%BA%86%E3%82%92%E5%BE%85%E3%81%A4%E3%82%88%E3%81%86%E3%81%ABpowershell%E3%81%AB%E6%8C%87%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/969013818/]] **[[Start-Process:https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.2]] [#mfa6266d] -[[PowerShellのStart-Processの使用方法とは? Start-Processを使いこなそう!:https://www.fenet.jp/infla/column/engineer/powershell%E3%81%AEstart-process%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E3%81%A8%E3%81%AF%EF%BC%9F-start-process%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%9D%E3%81%86%EF%BC%81/]] -[[Start-Processコマンドレット ArgumentList引数の罠:https://diarywind.com/blog/e/start-process-cmdlet-arglist-isnt-real-array.html]] Start-Process -FilePath [実行ファイルのパス] -ArgumentList [引数リスト] -NoNewWindow -Wait -PassThru -WorkingDirectory [プロセスの開始フォルダ] -Verb [動詞] ※Windowsでのみ機能 ***PassThru [#lbc2307b] -コマンドレットが開始した各プロセスのプロセスオブジェクトを返す -Wait-Process, Stop-Process で制御する場合は付ける ***Verbパラメタ [#c3387393] -[[Verbパラメータについてもっと知りたい:https://www.fenet.jp/infla/column/engineer/powershell%E3%81%AEstart-process%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E3%81%A8%E3%81%AF%EF%BC%9F-start-process%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%9D%E3%81%86%EF%BC%81/#Verb%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%82%82%E3%81%A3%E3%81%A8%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84]] -.exe --Open(開く) --RunAs(管理者権限で実行) --RunAsUser(別のユーザとして実行) -.cmd --Edit(編集) --Open(開く) --Print(印刷) --RunAs(管理者権限で実行) --RunAsUser(別のユーザとして実行) -.txt --Open(開く) --Print(印刷) **[[Wait-Process:https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/wait-process?view=powershell-7.2]] [#r5693dc2] -[[【Wait-Process】PowerShellで実行中のプロセスが停止するのを待つ方法:https://cheshire-wara.com/powershell/ps-cmdlets/system-service/wait-process/]] ***パターン1(プロセス名で指定) [#d14cbc0d] -Name <プロセス名> -Timeout <タイムアウト時間> ***パターン2(プロセスIDで指定) [#c0fb0fb2] -Id <プロセスID> -Timeout <タイムアウト時間> ***パターン3(オブジェクトで指定) [#t93536c4] -Timeout <タイムアウト時間> -InputObject <プロセスオブジェクト> **[[Stop-Process:https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/stop-process?view=powershell-7.2]] [#qe405f06] ***パターン3(オブジェクトで指定) [#tbe5c4f1] [-InputObject] <Process[]> [-PassThru] [-Force] [-WhatIf] [-Confirm] [<CommonParameters>] **テストプログラム [#sff4d12e] # プロセスオブジェクトを格納 $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 [#x817ef0c] -[[Windows PowerShell ワークフローの概念:https://docs.microsoft.com/ja-jp/system-center/sma/overview-powershell-workflows?view=sc-sma-2019]] -[[about_Workflows:https://docs.microsoft.com/ja-jp/powershell/module/psworkflow/about/about_workflows?view=powershell-5.1]] -[[Windows PowerShell ワークフローについて:https://docs.microsoft.com/ja-jp/previous-versions/windows/server/jj134242(v=ws.11)?redirectedfrom=MSDN]] -[[PowerShell における Windows Workflow Foundation 4.0 (WF) 利用のすすめ:https://tech.guitarrapc.com/entry/2013/09/08/170940]] -[[PowerShellでマルチスレッド処理(仮):https://kyabatalian.hatenablog.com/entry/2018/08/17/233348]] -[[PowerShellで並列実行させる方法【Workflow】:http://trend-desk.com/archives/1372]] -[[今更だけど、手っ取り早くPowershellで並列処理をする方法:https://qiita.com/DAHARA/items/692286e41a34e90ed337]] -PowerShell Core からはサポートされなくなった機能 *その他 [#l14caf90] -[[Invoke-ProducerConsumer.ps1 1.0 - PowerShell Gallery:https://www.powershellgallery.com/packages/Invoke-ProducerConsumer/1.0/Content/Invoke-ProducerConsumer.ps1]]