しばたテックブログ

気分で書いている技術ブログです。

Out-Stringを使ってSelect-Stringをより便利に使う

前回のエントリの補足的な感じです。

stknohg.hatenablog.jp

コンソールに出力される文字列はSelect-Stringの検索対象になるとは限らない

前回のエントリで書いた様にSelect-Stringは入力されたオブジェクトをString型に変換した文字列を検索します。
ここでちょっと面倒なのがコンソールに出力される文字列と実際に検索対象となる文字列が異なるという点です。
すなわち、コンソール上で適当なコマンドを実行して結果をSelect-Stringを使って絞り込もうとした場合、常に検索する文字列が何なのかを意識し続けないと正しく検索することができません。

これはこれで正しくあるべき姿なのでしょうが、実際にコンソール上で調べ物などをしている場合、なんらかのコマンドを実行してコンソールに出力される文字列をそのまま検索したい場合が結構あると思います。(私は結構あります。)

Out-Stringを使ってSelect-Stringをより便利に使う

こういった場合にOut-Stringコマンドレットを通すことで検索対象の文字列を“だいたい”*1コンソールに出力される文字列にすることができます。

ただ、このOut-Stringコマンドレット、デフォルトでは文字列を改行込みでまとめた形のString型で出力します。
このため、Selet-Stringで検索してヒットした場合全ての文字列が含められた形でヒットしてしまい使い物になりません。

1行毎に分けた形のString[]型で出力してくれば良いのにとTwitter上でボヤいていたところ、以下のことを教えていただきました。

ということでOut-String -Streamまたはossを使うことでコンソールに出力される文字列を良い感じに検索対象にすることができます。
前エントリの例をそのまま使うと、

PS C:\temp\HelloDir> ls | fl


    ディレクトリ: C:\temp\HelloDir



Name           : Hello.txt
Length         : 12
CreationTime   : 2015/08/20 21:36:47
LastWriteTime  : 2015/08/20 21:36:59
LastAccessTime : 2015/08/20 21:36:47
VersionInfo    : File:             C:\temp\HelloDir\Hello.txt
                 InternalName:
                 OriginalFilename:
                 FileVersion:
                 FileDescription:
                 Product:
                 ProductVersion:
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:

な場合に、

PS C:\temp\HelloDir> ls | fl | Out-String -Stream | Select-String "hello"

    ディレクトリ: C:\temp\HelloDir
Name           : Hello.txt
VersionInfo    : File:             C:\temp\HelloDir\Hello.txt

とすることでコンソールに出力されている文字列を検索対象にできます。

また、Select-Stringslsでエイリアスされていますので、

PS C:\temp\HelloDir> ls | fl | oss | sls "hello"

とも記述することができます。
コンソール上で作業している場合はこちらの方がキー入力もしやすくより便利にSelect-Stringを利用することができます。

補足

ちなみに、PowerShellから外部のコマンドを実行した場合はコンソールに出力される文字列がそのままString[]で返されます。
この場合はOut-StringせずともそのままSelect-Stringで検索できます。

例) netstat(.exe)(外部コマンド)でリスニングしているポートを調べたい場合

netstat -ano | sls LISTENING

*1:Out-Stringは外部コマンドやFormat-*なコマンドレットで成形された後の表示内容を文字列に変換します。