2007/12/16
(Get-ChildItem hogehoge).Lengthに注意
Get-ChildItemはパラメータのディレクトリ配下にあるFileInfoオブジェクトとDirectoryInfoの配列を返すのでそのLengthプロパティをとれば個数が求まります。たしかにそうなんですけど、hogehogeにファイルがただ一つある場合、配列ではなく一つのFileInfoオブジェクトが返されます。なので、そのLengthプロパティ(バイト数)を取ってきてしまうのです。せめてエラーになればいいんですが、ArrayとFileInfoで同じLengthプロパティを持つための悲劇です。
これを防ぐには、@(Get-ChildItem hogehoge).Lengthとします。ファイルが一個の場合でも強制的に配列にしますので戻り値は1となります。
これではまったー。フォルダ配下のすべてのフォルダにあるファイル数をそれぞれ列挙するスクリプトで@をつけなかったばかりに・・・
PS D:\script> dir -rec |%{if((Get-Item $_.fullname).PSISContainer){[string]@(dir $_.fullname).length + " " + $_.Fullname}}|more
[string]にキャストしてる理由は、PowerShellが演算子の左の型に右の型をキャストするためです。キャストしないと" "という文字列をintに変換しようとしてエラーになります。
こういうときに連想配列使いたいですが連想配列って値でソートできないんですよねぇ。(まぁテクはありますが)
元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/12/16/113134.aspxプライバシーポリシー