PowerShell パイプラインを速習しろ!
おっす!オラ、PowerShell大好き野郎。
今回はPowerShellの速習的なモンについて書いてみたいと思う。
1.PowerShellとはどんなシェルか
さっそくだが、PowerShellがどんなシェルか、ということをまずは提示しておきたい。
PowerShellは完全オブジェクトベースのシェルである。
しかも、.NET Frameworkのオブジェクトだ。
よって、コマンドプロンプトのような従来のテキストベースのシェルとは一線を画す。これはどういうことかと言うと......
オブジェクトが持つメンバーにアクセスできるというわけだゼ!
一例を示してみたい。
下記をプロンプトで打ってみる。
$str = "俺はオブジェクト"
$str.GetType()
ご覧の通り、変数$strは、.NET FrameworkのオブジェクトであるSystem.Stringであることが分かる。
※GetTypeはオブジェクトの型を調べるメソッド
さらに下記を打ってみる。
$str.Length
期待通り、System.StringのメンバーであるLengthプロパティにアクセスして、文字列の長さを取得することができた。
2.パイプラインとは
前セクションで、オブジェクトについて細かく書いたには理由がある。
PowerShellの避けては通れぬ、且つ偉大過ぎる機能、
パイプラインはオブジェクトが命!
だからである。
パイプライン。或いはパイプ処理。
ある処理を実行し、その処理結果(オブジェクト)を、次の処理の入力値にして、処理を流れるように繋げていく。
そう、流れるのはオブジェクトだゼ!
以降で、パイプ処理でよく使う主要なコマンドレットを取り上げ、パイプラインを馳走いたしたく思ふ。
※念のため、パイプ記号は以下の画像のド真ん中にあるやつだ!
3.データを並び替えろ!Sort-Object
Sort-Object(エイリアスSort)は、パイプラインで受け取ったオブジェクトを並び替えるためのコマンドレットだ。
C:¥hogeフォルダにあるファイルを取得し、ファイルサイズの降順で表示する。
Dir | Sort-Object Length -descending
※降順にする場合は、スイッチパラメータdescending(desc)を付ける。
デフォルトはスイッチパラメータなしで昇順となる。
4.欲しいプロパティだけぶっこ抜け!Select-Object
Select-Object(エイリアスSelect)は、パイプラインで受け取ったオブジェクトから、特定のプロパティのみを抜き出すコマンドレットだ。
C:¥hogeフォルダにあるファイルを取得し、Name,Lengthプロパティのみを表示する。
Dir | Select-Object Name,Length
※指定するプロパティはカンマ区切りにする。
5.ふるいにかけろ!Where-Object
Where-Object(エイリアスWhere、?)は、パイプラインで受け取ったオブジェクトから、特定条件にヒットするデータを取得するコマンドレットだ。
C:¥hogeフォルダにあるファイルを取得し、ファイル名に「太子」を含むデータを表示する。
Dir | Where-Object{$_.Name -like "*太子*"}
※条件式はスクリプトブロックと呼ばれる{ }で囲まれた中に記述する。
※$_はパイプラインで受け取ったオブジェクトが格納された特殊な変数(自動変数)。
※$_のあとに、ドットとプロパティ名を付けると、オブジェクトプロパティにアクセスできる。
※-likeはワイルドカード比較に合致する比較演算子
6.この指とまれ!Group-Object
Group-Object(エイリアスGroup)は、パイプラインで受け取ったオブジェクトから、同じプロパティ名同士のオブジェクトでグループ化するコマンドレットだ。
C:¥hogeフォルダにあるファイルを取得し、拡張子別にグルーピングする。
Dir | Group-Object Extension
※特筆すべきは、かなりSQLぽいところ!
※出力されるのは、オブジェクトの個数(Count)、プロパティの値(Name)、オブジェクトのリスト(Group)。
※末尾にスイッチパラメータ -NoElementを付与すると、一番右側に表示されているファイルの一覧を非表示化できる。
7.処理をかまし続けろ!ForEach-Object
ForEach-Object(エイリアスForEach、%)は、パイプラインで受け取ったオブジェクトに対して、1ブロックずつスクリプトブロックで指定した繰り返し作業をする。
C:¥hogeフォルダにあるファイルを取得し、ファイル名のフルパスをWrite-Hostコマンドレットを使ってプロンプト表示する。
Dir | ForEach-Object{Write-Host $_.FullName}
※ForEach-Objectコマンドレットと似て非なるもので、ForEachステートメントというものがある。
記述方法はもちろんだが、処理速度にも違いがある。PowerShellを覚えたての頃は大変に紛らわしかったゼ!
興味がある御仁は、一度調べてみると面白いと思われる。
8.複数パイプでどんどん繋げていけ!
パイプはどんどん繋げていける。SelectとWhereを1ライナーで利用した例。
C:¥hogeフォルダにあるファイルを取得し、拡張子がpdfのファイルだけを取得し、Nameプロパティのみを表示する
Dir | Where{$_.Extension -eq ".pdf"} | Select Name
※-eqは左辺⇔右辺が等しいを示す比較演算子
※パイプを繋げてPowerShellを楽しもうゼ!
以上、パイプライン速習を終了する。
PowerShell、イエーイ!