日々是好日

プログラミングについてのあれこれ、ムダ知識など

パイプ演算子とテキスト出力【PowerShell】

一本目のブログなので、いきなりコマンド入ってもアレかなーと思い少しだけPowerShellの説明をします。

簡単にPowerShell

古き良き Windows コマンドプロンプト (cmd.exe) の後継ソフトであり、現在はGitHubで開発が行われている。
Windows 7 以降のOSには標準搭載されている。

オブジェクト指向に基づいており、.NET上に構築されたタスクベースのコマンドラインシェル及びスクリプト言語だそうです。

注意点は、オブジェクト指向なので出力はオブジェクトになること。普通に使ってるとcmdと同様にテキスト出力されるのが多いですが、あくまで出力はオブジェクトなのでこれを忘れると大変そうです。

PowerShellのネイティブコマンドはcmdlet(コマンドレット)と呼ばれます。従来のcmdでも使われていたcddirは次のようなコマンドレットになります。

cmd コマンドレット エイリアス
cd Set-Location sl
dir Get-ChildItem gci

コマンドレットは原則動詞-名詞で記述され、読めばどういう動作をしそうなのかが分かるようにしているとのこと。
また、コマンドレットには一部エイリアスが設定されており、上記のcdSet-Locationslは同じ動作になります(正確に言えば、Set-Locationエイリアスとしてcdslが設定されている)。
ただしパラメータを設定する場合は、コマンドレットか省略形のエイリアスslgci)を使用したほうが良さそうです。

とても読みやすい公式ドキュメントがあるので、詳しい話はそちらへ……。

パイプ演算子

パイプラインは、コマンドライン インターフェイスで使用される最も重要な概念と言っても過言ではありません。 適切に利用すれば、パイプラインによって複雑なコマンドを使用する負荷が軽減され、より簡単にコマンドのワークフローを確認できるようになります。 パイプラインの各コマンド (パイプライン要素と呼ばれる) は、出力をパイプライン内の次のコマンドに項目単位で渡します。 コマンドでは、一度に複数の項目を処理する必要がなくなります。 結果として、リソース使用量が低下すると共に、出力の取得をすぐに開始できるようになります。
from: PowerShellパイプラインを理解する

CLI愛好家にはおなじみでしょうか。コマンドをつなげるときに使う | ←この記号です。
わりとどうでもいいことですが、日本語ではパイプ演算子、英語だと pipeline operator (パイプライン演算子) と呼ばれるようです。

実例は次のようになります。出力テキストファイルさえ設定すればすぐ実行できます(管理者権限で実行しないとUnauthorizedAccessException多発しますが、出力自体は出ます)。

PS> dir c:\windows\system32\* -include *.txt -recurse |
>> select-string -pattern "M.*t" -casesensitive |
>> out-file -filepath [出力path].txt

動作は次の通り。

system32フォルダ配下のテキストファイルを再帰的に走査
 ↓
正規表現M.*tに一致する行を取得(Microsoftなど)
 ↓
指定テキストファイルに出力

詳しく見ていきます。


dir c:\windows\system32\* -include *.txt -recurse |

dir c:\windows\system32\*で対象フォルダを指定。コマンドはGet-ChildItemgciでもOK。
Includeパラメータ: *.txtを指定することで、テキストファイルのみを探索。
Recurseパラメータ: system32フォルダ配下の全フォルダを再帰的に走査。
得られたテキストファイル(配列?)をパイプ演算子で次のコマンドレットに引き渡す。


select-string -pattern "M.*t" -casesensitive |

Unixで言うところのgrep正規表現検索を行う。
dirで引き渡されたテキストファイルから、"M.*t"にマッチする行を抽出する。一応"Microsoft"とかを想定してますが、それ以外にもいろいろ引っかかります。
Casesensitiveパラメータ: 大文字小文字を区別してマッチ。
得られた文字列をパイプ演算子で次のコマンドレットに引き渡す。


out-file -filepath [出力path].txt

引き渡された文字列を、Out-Fileコマンドレットで指定テキストファイルに出力する。
テキストファイルに"Microsoft"やら"Match"やらの文字列を含む行が出力されていると思います。

余談

次からはもっとメモっぽい簡潔記事になる予定。
個人的な課題として、公式ドキュメント・リファレンスのみを読んで記事を書きます。がんばる。
早くCLI使いこなせるようになりたい(((((((((((っ・ω・)っ ブーン