LoginSignup
9
7

More than 5 years have passed since last update.

PowerShellで戻り値が配列かどうか不定なコマンドレットを必ず配列で処理する方法

Last updated at Posted at 2016-05-15

■はじめに

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つでも配列で返ってくるようになりました。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7