今回はPowerShell特有のパイプラインとコマンドレットについて解説していきます。
※このページに掲載されいているプログラムは、PowerShellのバージョン:5.1.19041.3693 にて動作確認済みです。
【PowerShell】パイプラインとコマンドレットを徹底解説!
パイプラインとは、コマンドレット(cmdlet)やスクリプトといったコマンドの出力を、別のコマンドの入力として直接データを渡す機能です。
これにより異なるコマンドを組み合わせて、複雑なタスクを効果的に実行することができます。
パイプラインを使用することで、中間の結果を変数に格納することなく、効率的にデータを処理できます。
パイプラインの基本構文
PowerShellのパイプラインは、コマンドを連結するために |(パイプ)演算子を使用します。一つのコマンドの出力が次のコマンドの入力に渡されます。
1 |
Command1 | Command2 | Command3 |
メモ
- パイプラインを使用すると、データが生成されるたびに処理を行える。
- 各コマンドでデータが逐次処理され、パイプラインに結果が得られます。
- 中間結果を変数に格納せずにコードを効率的に記述できます。
- 冗長なコードを避けながら複雑なタスクを簡素なプログラムで実現可能。
- パイプラインはいくつでもつなげることが可能です。
パイプラインの使い方
まずは以下のプログラムを見てください。とてもシンプルな、変数の値をコンソールに呼び出す例です。
1 2 3 |
# C:\Samples1.ps1 $test = "テストです" echo $test |
実行結果
1 2 |
PS C:> ./Sample1.ps1 テストです |
これをパイプラインを使用するとどうなるでしょうか。
1 2 3 |
# C:\Samples2.ps1 $test = "テストです" $test | echo |
実行結果
1 2 |
PS C:> ./Sample2.ps1 テストです |
Sample1.ps1、Sample2.ps1ともに結果は同じです。
echoコマンドは通常右側に表示させる文字列を記載しないといけないですが、パイプラインによってデータを受け渡しているので、echoコマンドの右側に文字列を記載しなくても$test変数の値を表示させています。
上記例は、パイプラインの使い方をシンプルなプログラムで紹介しましたが、本来PowerShellでパイプラインを使用する際は、コマンドレットと合わせて使用すると効果的です。
その前に、まずはコマンドレットについて説明していきますね。
コマンドレットとは
コマンドレット(cmdlet)は、PowerShellおよびコマンドプロンプトで使用されるコマンドの基本的な構成要素です。
簡単に実行できる小さなコマンド単位で、様々なタスクを実行するために使用されます。
コマンドレットは「動詞-名詞」の形式で成り立っていて、動詞はコマンドのアクションを示し、名詞は対象を示します。
例えば、Get-ProcessやStop-Serviceなどがコマンドレットの典型的な例です。
以下、動詞と名詞で分けて表にまとめてみました。
コマンド | 説明 |
Get- | データを取得するコマンド |
Set- | データを設定するためのコマンド |
Start- | プロセスやサービスを開始するコマンド |
Stop- | プロセスやサービスを停止すコマンド |
Format- | 結果を整形するためのコマンド |
-Date | 日時に対して動作するコマンド |
-Item | アイテムに対して動作するコマンド |
-ChildItem | フォルダ内のアイテムに対して動作するコマンド |
-Process | プロセスに対して動作するコマンド |
-Service | サービスに対して動作するコマンド |
-Object | オブジェクトに対して動作するコマンド |
動詞と名詞を組み合わせると、以下のような操作が可能です。
コマンド | 説明 |
Write-Host | いわゆるechoと同じ |
Get-Date | 現在の日時を取得する |
Get-Item | アイテムを取得する |
Get-Process | プロセスを取得する |
Get-Service | サービスを取得する |
Set-Variable | 変数に値を設定する |
Start-Service | サービスを開始する |
Stop-Service | サービスを停止する |
Start-Process | プロセスを開始する |
Stop-Process | プロセスを停止する |
Import-Csv | csvファイルをPowerShellにオブジェクトとして取り込む |
Export-Csv | PowerShellのオブジェクトをcsvファイルに書き出す |
Format-Table | 表形式でデータを表示する |
Format-List | リスト型でデータを表示する |
Select-Object | オブジェクトのプロパティを選択する |
Where-Object | オブジェクトをフィルタリングする |
Sort-Object | オブジェクトの並び替えをする |
ForEach-Object | それぞれのオブジェクトの要素に対して操作する |
コマンドではなく、プログラムコードのforやforeachを使ってファイルの中身を確認することも可能です。詳しくは以下をご覧ください。
-
【Powershell】for文を使った繰り返し処理を例題で解説
目次forの構文forの基本構文forの使用例forで配列処理forで配列処理の使用例foreachで配列処理foreachで配列処理の使用例continue文、break文の使い方continue文 ...
続きを見る
コマンドレットの使い方
では、コマンドレットを使用したいくつかの例を交えて解説していきます。
Get-Process
現在動作しているプロセスを取得するコマンドです。
1 2 |
# C:\Samples3.ps1 Get-Process |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
PS C:> ./Sample3.ps1 Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName s ------- ----- ----- ----- ------ -- -- ----------- 150 11 1868 8388 15.63 3916 11 ApMsgFwd 113 8 1168 6016 0.11 23844 11 ApntEx 312 16 3224 15956 1.91 19996 11 Apoint 321 19 9056 26892 0.11 26356 11 ApplicationFrameHost 72 5 768 4248 0.06 22220 11 ApRemote 317 17 4160 14300 5048 0 armsvc 365 24 64304 99284 2.53 268 11 chrome 387 23 35404 74332 3.28 884 11 chrome 289 20 24588 48132 0.88 2196 11 chrome 294 21 29368 48032 0.97 2404 11 chrome 362 22 28264 53604 1.03 4288 11 chrome 330 23 28540 54876 0.80 6996 11 chrome 521 23 54116 92788 3.06 7144 11 chrome ※まだまだ続きます |
Get-Content
コンテンツの中身を表示させるコマンドです。
以下のテキストファイルを読み込むコマンドを例とします。
1 2 |
# C:\Samples4.ps1 Get-Content -Path "C:\test.txt" |
実行結果
1 2 3 |
PS C:> ./Sample4.ps1 縺薙■繧峨・繝・せ繝医ユ繧ュ繧ケ繝医〒縺吶・ 荳ュ霄ォ縺ッ繧ウ繝ウ繧ス繝シ繝ォ荳翫〒陦ィ遉コ縺輔l縺セ縺励◆縺具シ |
これは文字化けという現象で、文字には文字コードというものがあります。
PowerShellのデフォルトの文字コードはshift_jisですが、shift_jisだと日本語が文字化けしてしまいます。
UTF-8という文字コードであれば、日本語は文字化けしなくなります。
なので、文字化けを防ぐ場合は -Encoding UTF8 のオプションをつけてあげます。
1 2 |
# C:\Samples4.ps1 Get-Content -Path "C:\test.txt" -Encoding UTF8 |
実行結果
1 2 3 |
PS C:> ./Sample4.ps1 こちらはテストテキストです。 コンソール上で表示されましたか? |
メモ
PowerShellの実行結果に文字化けが発生したら、-Encoding UTF8 のオプションをつける。
Get-ChildItem
指定したフォルダ内のアイテムを一覧表示させるコマンドです。
以下画像のフォルダ内のファイルを表示させてみましょう。
1 2 |
# C:\Samples5.ps1 Get-ChildItem -Path "C:\testフォルダ" |
実行結果
1 2 3 4 5 6 7 8 |
PS C:> ./Sample5.ps1 ディレクトリ: C:\testフォルダ Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2023/11/27 14:47 6553 test.xlsx -a---- 2023/11/27 16:22 1213 test1.txt -a---- 2023/11/27 16:22 583 test2.txt -a---- 2023/11/27 16:21 3958 test3.txt |
コマンドレットとパイプラインを組み合わせる
コマンドレットとパイプラインがわかったところで、2つを組み合わせてみましょう。
ファイルの内容を表示する例
これはGet-Contentでファイルの内容を取得して、ForEach-Objectを使用して各行ごとに表示しています。
これにより、ファイルの内容を行ごとに処理できます。
1 2 3 |
# C:\Samples6.ps1 Get-Content -Path "C:\test.txt" -Encoding UTF8 | ForEach-Object { $_ } |
実行結果
1 2 3 |
PS C:> ./Sample6.ps1 こちらはテストテキストです。 コンソール上で表示されましたか? |
メモ
PowerShellは改行してもプログラムとして読み取りが可能。パイプラインなどを目印にして改行すると可読性が上がる。
プロセスの一覧を表示して、その中から特定のプロセスをフィルタリングする例
こちらはまず、Get-Processで現在動作しているプロセスを取得して、Where-Objectでフィルタリングしています。
フィルタリングの内容はWorkingSetが100MBより上の項目です。
さらに、Format-Tableで表示するのをProcessName,とWorkingSetのみにして見やすく整形しています。
1 2 3 4 |
# C:\Samples7.ps1 Get-Process | Where-Object { $_.WorkingSet -gt 100MB } | Format-Table -Property ProcessName, WorkingSet |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
PS C:> ./Sample7.ps1 ProcessName WorkingSet ----------- ---------- chrome 147361792 chrome 194609152 chrome 193716224 ctfmon 124973056 explorer 146538496 Memory Compression 310022144 MsMpEng 162287616 powershell_ise 162078720 SearchApp 168361984 |
コマンドの中にある-gtを見て、理解できない方は以下もご覧ください。
-
【Powershell】if文の使い方や使用例を分かりやすく解説
目次ifの構文elseif、elseの構文比較演算子比較演算子の使用例like、matchの使用例論理演算子論理演算子を利用した条件分岐の使用例まとめ Powershellのif文の書き方を解説してい ...
続きを見る
ファイルサイズ順にファイルを表示する例
Get-ChildItemでフォルダ内のファイルを取得し、Sort-Objectでファイルの大きさ順に並べ替え、Select-Objectでファイル名とファイルの大きさの身を表示させています。
1 2 3 4 |
# C:\Samples8.ps1 Get-ChildItem -Path "C:\testフォルダ" | Sort-Object Length | Select-Object Name, Length |
実行結果
1 2 3 4 5 6 7 |
PS C:> ./Sample8.ps1 Name Length ---- ------ test2.txt 583 test1.txt 1213 test3.txt 3958 test.xlsx 6553 |
まとめ
コマンドレットとパイプラインを使いこなすことで、PowerShell特有の操作が可能になります。
大量なファイルを一度に作成したり、不要なプロセスを停止させたり、ファイルの中身を検索したり…。
いろいろ使い方がありますので、気になる方は調べてみてください。
プログラミング知識を身に着けたい人におすすめの無料スクールはこちら。