パイプ演算子とテキスト出力【PowerShell】
一本目のブログなので、いきなりコマンド入ってもアレかなーと思い少しだけPowerShellの説明をします。
簡単にPowerShell
古き良き Windows コマンドプロンプト (cmd.exe) の後継ソフトであり、現在はGitHubで開発が行われている。
Windows 7 以降のOSには標準搭載されている。
オブジェクト指向に基づいており、.NET上に構築されたタスクベースのコマンドラインシェル及びスクリプト言語だそうです。
注意点は、オブジェクト指向なので出力はオブジェクトになること。普通に使ってるとcmdと同様にテキスト出力されるのが多いですが、あくまで出力はオブジェクトなのでこれを忘れると大変そうです。
PowerShellのネイティブコマンドはcmdlet(コマンドレット)と呼ばれます。従来のcmdでも使われていたcd
やdir
は次のようなコマンドレットになります。
cmd | コマンドレット | エイリアス |
---|---|---|
cd | Set-Location | sl |
dir | Get-ChildItem | gci |
コマンドレットは原則動詞-名詞
で記述され、読めばどういう動作をしそうなのかが分かるようにしているとのこと。
また、コマンドレットには一部エイリアスが設定されており、上記のcd
とSet-Location
とsl
は同じ動作になります(正確に言えば、Set-Location
のエイリアスとしてcd
とsl
が設定されている)。
ただしパラメータを設定する場合は、コマンドレットか省略形のエイリアス(sl
やgci
)を使用したほうが良さそうです。
とても読みやすい公式ドキュメントがあるので、詳しい話はそちらへ……。
パイプ演算子
パイプラインは、コマンドライン インターフェイスで使用される最も重要な概念と言っても過言ではありません。 適切に利用すれば、パイプラインによって複雑なコマンドを使用する負荷が軽減され、より簡単にコマンドのワークフローを確認できるようになります。 パイプラインの各コマンド (パイプライン要素と呼ばれる) は、出力をパイプライン内の次のコマンドに項目単位で渡します。 コマンドでは、一度に複数の項目を処理する必要がなくなります。 結果として、リソース使用量が低下すると共に、出力の取得をすぐに開始できるようになります。
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-ChildItem
やgci
でも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使いこなせるようになりたい(((((((((((っ・ω・)っ ブーン