2011年3月28日月曜日

◆文字列で抽出するFilterを作る

今日ネットを眺めていて以下のようなFilterを見つけた。
20110328133923

一見便利そうであるが、背景を理解せずに無闇につかうのもどうかと思うので、個人的な解説を述べる。(あくまでも個人的な)

本来Powershellではパイプラインで渡すのは、これまでのように文字列ではなくオブジェクトだよっていうのが一番の売りなので無闇に文字列にして処理するのはナンセンス。(当然これを作った人はそれを理解した上で文字列で検索すると便利なこともあるよと言っているのだが)

Powershell的に上記処理を行うのであれば、

PS>Get-Service | ?{$_.Status -like "Run*"}

Status   Name               DisplayName
------   ----               -----------
Running  AeLookupSvc        Application Experience
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  AudioSrv           Windows Audio
Running  BFE                Base Filtering Engine
Running  BITS               Background Intelligent Transfer Ser...

とやるのが普通。

まぁ、それでもプロパティ名を調べるのが面倒とか、もともと文字列でしか結果が帰ってこないコマンドもあるので一律文字列で検索るような上記Filterは有効とは思う。

ただし、文字列を検索するならSelet-Stringという専用のコマンドレットの使用も検討したほうが良いだろう。
以下はByPropertyNameなパラメータを文字列で検索している。

PS>Get-Help dir -full | Out-String -Stream | Select-String -Pattern "ByPropertyName" -Context 7,0

      -LiteralPath <string[]>
          場所のパスを 1 つ以上指定します。Path と異なり、LiteralPath の値は入力したとおりに使用さ
字はありません。パスにエスケープ文字が含まれている場合は、単一引用符で囲みます。単一引用符で囲んだ
           シーケンスとして解釈されません。

          必須                         true
          位置                         1
          既定値
>         パイプライン入力を許可する   true (ByPropertyName)

      -Path <string[]>
          場所のパスを 1 つ以上指定します。ワイルドカードを使用できます。既定の場所は現在のディレク

          必須                         false
          位置                         1
          既定値
>         パイプライン入力を許可する   true (ByValue, ByPropertyName)

ByPropertyNameを含んだ行だけを表示しても何のパラメータか判らないので、該当行の前7行を一緒に表示させている。「>」付きで表示されている行が実際にヒットした行である。

当初のFilterをContext機能付きに書き換えてみた。

001
002
003
004
005
006
007

filter grep($keyword,$context=(0,0))
{
 
$_ | Out-String -Stream | Select-String -Pattern $keyword -Context $context
}

gsv | grep Running
Get-Help dir -Full | grep bypropertyname 8,0

0 件のコメント:

コメントを投稿