■はじめに
PowerShellでは、戻り値が配列だったり配列でなかったりするコマンドレットがあります。
例えば Get-ChildItem というフォルダやファイルの一覧を取得するコマンドレットでは
結果が1つの場合はDirectoryInfoやFileInfoの1つのオブジェクトが返ってきますが、
結果が複数の場合は配列で返ってきます。
そのため、あとで .Length
で配列の要素数を取得しようと思っても
想定と違った結果になってしまう、などの不都合が起こります。
■ 困る例
結果が1つの場合
PS D:\> Get-ChildItem "out.csv"
ディレクトリ: D:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2016/04/25 22:25 987728 out.csv # 1ファイルのみ
PS D:\> $item = Get-ChildItem "out.csv"
PS D:\> $item.length
987728 # ●配列の要素数ではなくファイルサイズが返ってくる
PS D:\> $item.GetType() | Format-Table -AutoSize
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True FileInfo System.IO.FileSystemInfo # 配列ではなくFileInfo
結果が複数の場合(配列で返ってくる)
PS D:\> Get-ChildItem "*.csv"
ディレクトリ: D:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2016/04/25 22:25 987728 out.csv # 2つのファイル
-a--- 2016/05/15 17:39 0 xxx.csv
PS D:\> $item = Get-ChildItem "*.csv"
PS D:\> $item.Length
2 # ●配列の要素数が返ってくる
PS D:\> $item.GetType() | Format-Table -AutoSize
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array # 配列で返ってきた
■ 対処方法
配列の書式である@()
でコマンドレットを囲ってやります。
PS D:\> $item = @(Get-ChildItem "out.csv") # @()で囲う
PS D:\> $item.Length
1 # ●配列の要素数が返ってくる
PS D:\> $item.GetType() | Format-Table -AutoSize
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array # 配列で返ってきた
これで、結果が1つでも2つでも配列で返ってくるようになりました。