前回のエントリの補足的な感じです。
コンソールに出力される文字列はSelect-Stringの検索対象になるとは限らない
前回のエントリで書いた様にSelect-String
は入力されたオブジェクトをString型に変換した文字列を検索します。
ここでちょっと面倒なのがコンソールに出力される文字列と実際に検索対象となる文字列が異なるという点です。
すなわち、コンソール上で適当なコマンドを実行して結果をSelect-String
を使って絞り込もうとした場合、常に検索する文字列が何なのかを意識し続けないと正しく検索することができません。
これはこれで正しくあるべき姿なのでしょうが、実際にコンソール上で調べ物などをしている場合、なんらかのコマンドを実行してコンソールに出力される文字列をそのまま検索したい場合が結構あると思います。(私は結構あります。)
Out-Stringを使ってSelect-Stringをより便利に使う
こういった場合にOut-Stringコマンドレットを通すことで検索対象の文字列を“だいたい”*1コンソールに出力される文字列にすることができます。
ただ、このOut-String
コマンドレット、デフォルトでは文字列を改行込みでまとめた形のString型で出力します。
このため、Selet-String
で検索してヒットした場合全ての文字列が含められた形でヒットしてしまい使い物になりません。
1行毎に分けた形のString[]型で出力してくれば良いのにとTwitter上でボヤいていたところ、以下のことを教えていただきました。
@stknohg Out-String -Stream をどぞ
— 牟田口大介 (@mutaguchi) 2015年8月20日
@stknohg ちなみにOut-String -Streamをラップしたossという関数もあります。
— 牟田口大介 (@mutaguchi) 2015年8月20日
Out-String -Stream の本当の良さは、パイプラインの流れをせき止めないことなのです。つまり整形した結果を文字列としてリアルタイム出力出来るにゃ。
— guitarrapc_tech (@guitarrapc_tech) 2015年8月20日
ps | Format-Table | out-string -Stream | Out-File -Append
ということで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-String
はsls
でエイリアスされていますので、
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-*なコマンドレットで成形された後の表示内容を文字列に変換します。