読者です 読者をやめる 読者になる 読者になる

一夜明けて

Monad Windows

これまでのコマンドラインアプリは?

標準入出力がオブジェクトになったはいいけど、これまで使っていた grep とか sed は使えるの?。と思って試してみました。昨日のような get-childitem といったコマンドの本名じゃなくて、エイリアスの方を使っています。

MSH D:\> ls


    Directory: Microsoft.Management.Automation.Core\FileSystem::D:\


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2005/01/30     16:18       1691 altchecker.js
-a---        2005/04/14     23:53      33792 nyoro.doc
-a---        2004/03/11      1:25         39 test.css
d----        2005/01/14      0:44            cygwin
d----        2003/08/23      1:26            downloads
d----        2004/03/27     20:47            DRIVERS
d----        2006/02/05      1:54            games
d----        2004/02/01     13:18            home
d----        2005/02/19     14:28            jstools


MSH D:\> ls | egrep "js"
-a---        2005/01/30     16:18       1691 altchecker.js
d----        2005/02/19     14:28            jstools
MSH D:\> ls | egrep "js" | where {$_ -match "\.js"}
-a---        2005/01/30     16:18       1691 altchecker.js

ドキュメントでは、.NET のオブジェクトをやりとりできるコマンドのことを Cmdlets (コマンドレット)と呼んでますが、最後のコマンド行で言えば、ls(get-childitem)where(where-object) がコマンドレットで egrep がこれまでのコマンドラインアプリです。

ともかく、ls(get-childitem) から egrep にも無事文字列で渡っているようで、次の egrep から where(where-object) もちゃんと文字列が渡って絞り込むことができました。

where の中で使っている「現在のパイプライン上のオブジェクト」を示す $_ の中に、そのまま文字列型がそっくり入ってきたようです。昨日はここに FileInfo オブジェクトが来ていたので $_.name プロパティを使っていました。

エスケープ文字は ` (逆クオート)

ところで gawk がうまく使えずにびびっちゃいました。

MSH D:\> get-childitem | gawk "/js/{print $1}"
-a---        2005/01/30     16:18       1691 altchecker.js
d----        2005/02/19     14:28            jstools

$5 って書いたのに全部丸出し(awk$数字 は、○番目のフィールドってことです。)

どうやら $ は MSH 的にとにかくそこで変数代入しろということらしく、クォートの中にあっても駄目みたいです。ドキュメントを見ると MSH のエスケープ文字は逆クォートということなので、

MSH D:\> get-childitem | gawk "/js/{print `$1}"
-a---
d----

ぱちぱちぱち。でも…、

MSH D:\> get-item altchecker.js


    Directory: Microsoft.Management.Automation.Core\FileSystem::D:\


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2005/01/30     16:18       1691 altchecker.js


MSH D:\> get-childitem | gawk "/\.js/{print `$5}"
altchecker.js
MSH D:\> get-childitem | gawk "/\.js/{print `$5}" | get-item
get-item : Input object cannot be bound to any parameters for the command
either because the command does not take pipeline input or the input and
its properties do not match any of the parameters that take pipeline input.
At line:1 char:51
 + get-childitem | gawk "/\.js/{print `$5}" | get-item <<<<

これが動かない。get-item コマンドが取る引数と、パイプラインで来てるオブジェクトが合ってないとおっしゃる。get-item は文字列を取るので、これで行けると思ったのですが…。うーんうーん。