全2話で PowerShell で、複数のデータ(オブジェクト)を複数のコマンドレットで処理する際の、処理の流れについてプログラムを実行して検証します。
データ全体に対して並び替えの処理を行う Sort-Object による処理の流れの違いについても検証します。
※ Windows PowerShell 5.1.19041.5965 を使用します。
※プログラムは自己責任でご利用ください。
前回の記事
前半では、パイプでつながった処理は、オブジェクト1つずつ順番に実行されることがわかりました。
今回は、このプログラムの中間の処理に Sort-Object コマンドレットを入れた場合の、処理の流れの変化について紹介します。
Sort-Object を中間に加えた処理の流れ
前回の、 Input, Output の後にパイプラインで渡されたオブジェクトの値を表示する処理の間に、 Sort-Object コマンドレットを下記の3行目に追加しました。
1, 3, 2 |
ForEach-Object { Write-Host "Input: $_"; $_ } |
Sort-Object |
ForEach-Object { Write-Host "Output: $_" }
Sort-Object コマンドレットの前後の Write-Host で Input, Output で始まる文字列のあとに、| (パイプ)から渡された $_ 自動変数に格納されているオブジェクトの値の表示を行います。
※ Write-Host コマンドレットについては前半の記事を参照してください。
Sort-Object が逐次処理の場合の、処理の流れの推測
Sort-Object も前回の ForEach-Object, Write-Host コマンドレットとのように逐次処理だとすれば、
Input: 1
Output: 1
Input: 3
Output: 3
Input: 2
Output: 2
となりますが、 Sort-Object コマンドレット は、全てのオブジェクトをソートするために、上流の全てのオブジェクトを集めて処理するまで、処理を下流に渡しません。
実際の結果は、Sort-Object で上流の全ての処理結果が集められる
実際に処理の流れを確認するため、先ほどのプログラムを Windows PowerShell アプリに貼り付けて Enter キーを押して実行してみましょう。
※ Windows 10 の場合、エクスプローラのアドレスバーで powershell⏎ と入力すると、そのフォルダをカレントディレクトリにして Windows PowerShell アプリを起動できます。
結果は、上流の全てのオブジェクト (1, 3, 2) の処理が Sort-Object コマンドレットの直前の Input から始まる表示処理が一括で行われ、その後、Sort-Object コマンドレットで並び替えた順番 (1, 2, 3) で1つずつ次の処理で Output から始まる表示処理が行われました。
PS G:\Dev\PowerShell> 1, 3, 2 |
>> ForEach-Object { Write-Host "Input: $_"; $_ } |
>> Sort-Object |
>> ForEach-Object { Write-Host "Output: $_" }
Input: 1
Input: 3
Input: 2
Output: 1
Output: 2
Output: 3
このことからパイプラインは基本的に1個ずつ下流にオブジェクトを渡し処理を行いますが、 Sort-Object コマンドレットなど全てのオブジェクトを処理対象にするコマンドレットでは、上流からの全てのオブジェクトを一時的に保持することが推測できます。

Sort-Object はメモリ使用量に注意
Sort-Object コマンドレットのように、上流の処理結果を全て集める処理では、メモリ使用量に注意が必要です。
power shellで複数CSVをソートし、重複しているレコードのリストを作成する
[Q&A] 大容量ファイルのソート時のメモリ不足の回避 – Qiita
プログラムを作成しています。
sort-objectでソートを行う際に、メモリ使用量がほぼ100%となり
最終的にマシンにログインができなくなってしまっている状況です。
Sort-Object コマンドレットの使用例
Sort-Object コマンドレットについては、以下の記事も参照してください。
まとめ
今回は全2話で、Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、複数のデータ(オブジェクト)を複数のコマンドレットで処理する際の、処理の流れについてプログラムを実行して検証します。
データ全体に対して並び替えの処理を行う Sort-Object による処理の流れの違いについても検証します。
参照サイト Thank You!
- PowerShell とは – PowerShell | Microsoft Learn
- ForEach-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn
- Write-Host (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
- Sort-Object (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
- PowerShellにおける「文」と「式」についての考察 – PowerShell Scripting Weblog
- [Q&A] 大容量ファイルのソート時のメモリ不足の回避 – Qiita
記事一覧 → Compota-Soft-Press
コメント