Format-Listでオブジェクトのプロパティを見る

シェルの場合パイプラインを流れるのは見たままのデータなのだが、PowerShell Coreではパイプラインの間を移動していくのはオブジェクトで、表示されているデータそのものではないことは、これまで何度か触れてきた。

そうなると、そもそもそのオブジェクトとは何だということになるわけだが、今回はそれを体感しやすくするコマンドレットとしてFormat-Listについて紹介しよう。

例えば、これまでに取り上げたファイルやディレクトリの一覧を表示するコマンドレットGet-ChildItemを見てみよう。

Get-ChildItemコマンドレットを実行すると、次のようにファイルやディレクトリの一覧を得ることができる。

Get-ChildItemコマンドレットでファイルやディレクトリの一覧を表示

PS /Users/daichi/Documents/powershell/20180625> Get-ChildItem


    Directory: /Users/daichi/Documents/powershell/20180625


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/07/03     18:03                commands
d-----       2018/07/03     18:03                tables
------       2018/07/03     18:03            557 Makefile
------       2018/07/03     18:03           6088 typescript.xml


PS /Users/daichi/Documents/powershell/20180625>

シェルやコマンドプロンプトでlsコマンドやdirコマンドを実行したのであれば、出力されるのは表示されているファイルやディレクトリの一覧の文字列データそのままだ。しかし、PowerShell Coreの場合はそうではなく、オブジェクトデータから見えているデータが選択されて表示される。

このコマンドレットの出力をパイプラインでFormat-Listコマンドレットにつないでみよう。出力が次のように変化する。

Get-ChildItemをパイプラインでFormat-Listへ接続

PS /Users/daichi/Documents/powershell/20180625> Get-ChildItem | Format-List


    Directory: /Users/daichi/Documents/powershell/20180625



Name           : commands
CreationTime   : 2018/07/03 18:03:27
LastWriteTime  : 2018/07/03 18:03:27
LastAccessTime : 2018/07/03 18:03:27
Mode           : d-----
LinkType       :
Target         :

Name           : tables
CreationTime   : 2018/07/03 18:03:27
LastWriteTime  : 2018/07/03 18:03:27
LastAccessTime : 2018/07/03 18:03:27
Mode           : d-----
LinkType       :
Target         :

Name           : Makefile
Length         : 557
CreationTime   : 2018/07/03 18:03:27
LastWriteTime  : 2018/07/03 18:03:27
LastAccessTime : 2018/07/03 18:03:27
Mode           : ------
LinkType       :
Target         :
VersionInfo    : File:             /Users/daichi/Documents/powershell/20180625/
                 Makefile
                 InternalName:
                 OriginalFilename:
                 FileVersion:
                 FileDescription:
                 Product:
                 ProductVersion:
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:


Name           : typescript.xml
Length         : 6088
CreationTime   : 2018/07/03 18:03:27
LastWriteTime  : 2018/07/03 18:03:27
LastAccessTime : 2018/07/03 18:03:27
Mode           : ------
LinkType       :
Target         :
VersionInfo    : File:             /Users/daichi/Documents/powershell/20180625/
                 typescript.xml
                 InternalName:
                 OriginalFilename:
                 FileVersion:
                 FileDescription:
                 Product:
                 ProductVersion:
                 Debug:            False
                 Patched:          False
                 PreRelease:       False
                 PrivateBuild:     False
                 SpecialBuild:     False
                 Language:




PS /Users/daichi/Documents/powershell/20180625>

コロンの前がプロパティの名前で、コロンの後がプロパティの値ということになる。実際にはこのようなデータのまとまりがオブジェクトとしてパイプラインを経由して流れており、Format-Listコマンドレットはそのオブジェクトからプロパティを取り出して表示している。

日付データを表示するGet-Dateコマンドレットで同じことをしてみよう。Get-Dateコマンドレットを実行すると次のように実行した時刻が表示される。

Get-Dateコマンドレットを実行

PS /Users/daichi/Documents/powershell/20180625> Get-Date

2018年7月3日 火曜日 18:09:26


PS /Users/daichi/Documents/powershell/20180625>

Get-Dateコマンドレットの出力をFormat-Listコマンドレットに接続すると、次のように日付データがプロパティとして流れていることを確認できる。

Get-Dateコマンドレットの出力をFormat-Listコマンドレットに接続

PS /Users/daichi/Documents/powershell/20180625> Get-Date | Format-List


DisplayHint : DateTime
Date        : 2018/07/03 0:00:00
Day         : 3
DayOfWeek   : Tuesday
DayOfYear   : 184
Hour        : 18
Kind        : Local
Millisecond : 393
Minute      : 9
Month       : 7
Second      : 45
Ticks       : 636662381853939000
TimeOfDay   : 18:09:45.3939000
Year        : 2018
DateTime    : 2018年7月3日 火曜日 18:09:45



PS /Users/daichi/Documents/powershell/20180625>

実際には、オブジェクトとして、目に見える出力結果よりも多くのデータがパイプラインを流れていることがなんとなく実感できただろうか。

Format-Listで表示されないケース

すべてのケースでこのようにプロパティが表示されるわけではない。

例えば、次のようにファイルをCopy-Itemコマンドレットでコピーしたとする。

Copy-Itemコマンドレットでファイルをコピー

PS /Users/daichi/Documents/powershell/20180625> Copy-Item ./Makefile ./Makefile.org
PS /Users/daichi/Documents/powershell/20180625>

この処理をパイプラインで接続してFormat-Listコマンドレットに接続しても、何も表示されない。

Copy-ItemコマンドレットをFormat-Listコマンドレットに接続、何も表示されない

PS /Users/daichi/Documents/powershell/20180625> Copy-Item ./Makefile ./Makefile.org | Format-List
PS /Users/daichi/Documents/powershell/20180625>

ファイルの中身を表示するGet-Contentコマンドレットでも同じことをしてみよう。

次のようにGet-Contentコマンドレットでファイルの中身を表示させる。

Get-Contentコマンドレットでファイルの中身を表示

PS /Users/daichi/Documents/powershell/20180625> Get-Content ./Makefile
# Copyright (c) 2007 ONGS Inc.
# All rights reserved.
#
# This software may be used, modified, copied, and distributed, in
# both source and binary form provided that the above copyright and
# these terms are retained. Under no circumstances is the author
# responsible for the proper functioning of this software, nor does
# the author assume any responsibility for damages incurred with its
# use.

# author: Daichi GOTO (daichi@ongs.co.jp)
# first edition: Tue Mar 27 14:58:04 2007
# last modified: $Date$
# version: $Revision$

.include "../mk/base.mk"
PS /Users/daichi/Documents/powershell/20180625>

これをFormat-Listコマンドレットに接続しても、次のようにGet-Contentコマンドレットと同じ結果が出力される。

Get-Contentコマンドレットでテキストファイルの中身を持ってきてFormat-Listに接続、同じ内容が出力されるだけ

PS /Users/daichi/Documents/powershell/20180625> Get-Content ./Makefile | Format-List
# Copyright (c) 2007 ONGS Inc.
# All rights reserved.
#
# This software may be used, modified, copied, and distributed, in
# both source and binary form provided that the above copyright and
# these terms are retained. Under no circumstances is the author
# responsible for the proper functioning of this software, nor does
# the author assume any responsibility for damages incurred with its
# use.

# author: Daichi GOTO (daichi@ongs.co.jp)
# first edition: Tue Mar 27 14:58:04 2007
# last modified: $Date$
# version: $Revision$

.include "../mk/base.mk"
PS /Users/daichi/Documents/powershell/20180625>

また、Get-ChildItemコマンドレットのようにオブジェクトを出力するコマンドレットであっても、Out-Stringコマンドレットを経由してオブジェクトを連続した文字列データに変換してからFormat-Listコマンドレットに接続すると、次のように目に見えている出力がそのまま出力されるようになる。

Out-Stringコマンドレットでオブジェクトから連続した文字列に変換、Format-Listコマンドレットに接続してもプロパティは表示されなくなる

PS /Users/daichi/Documents/powershell/20180625> Get-ChildItem | Out-String | Format-List


    Directory: /Users/daichi/Documents/powershell/20180625


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/07/03     18:03                commands
d-----       2018/07/03     18:03                tables
------       2018/07/03     18:03            557 Makefile
------       2018/07/03     18:03            557 Makefile.org
------       2018/07/03     18:03           6088 typescript.xml



PS /Users/daichi/Documents/powershell/20180625>

わかりにくいところではあるが、PowerShell Coreでは、このようにオブジェクトもパイプラインを流れるし、文字列データもパイプラインを流れていく。文字列としてデータが流れている場合にはプロパティは出てこない。

表示するプロパティを指定する

Format-Listコマンドレットは、次のように-Propertyオプションで表示するプロパティを指定することができる。

-Propertyオプションで表示するプロパティを指定した場合

PS /Users/daichi/Documents/powershell/20180625> Get-ChildItem | Format-List -Property Name, Length, Extension, FullName


Name      : commands
Extension :
FullName  : /Users/daichi/Documents/powershell/20180625/commands

Name      : tables
Extension :
FullName  : /Users/daichi/Documents/powershell/20180625/tables

Name      : Makefile
Length    : 557
Extension :
FullName  : /Users/daichi/Documents/powershell/20180625/Makefile

Name      : typescript.xml
Length    : 6088
Extension : .xml
FullName  : /Users/daichi/Documents/powershell/20180625/typescript.xml



PS /Users/daichi/Documents/powershell/20180625>

逆に、すべてのプロパティを表示させたい場合には引数に*を指定する。

引数に*を指定、すべてのプロパティが表示される

 /Users/daichi/Documents/powershell/20180625> Get-ChildItem | Format-List *


PSPath            : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625/commands
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625
PSChildName       : commands
PSDrive           : /
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Mode              : d-----
BaseName          : commands
Target            :
LinkType          :
Name              : commands
Parent            : 20180625
Exists            : True
Root              : /
FullName          : /Users/daichi/Documents/powershell/20180625/commands
Extension         :
CreationTime      : 2018/07/03 18:03:27
CreationTimeUtc   : 2018/07/03 9:03:27
LastAccessTime    : 2018/07/03 18:03:27
LastAccessTimeUtc : 2018/07/03 9:03:27
LastWriteTime     : 2018/07/03 18:03:27
LastWriteTimeUtc  : 2018/07/03 9:03:27
Attributes        : Directory

PSPath            : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625/tables
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625
PSChildName       : tables
PSDrive           : /
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Mode              : d-----
BaseName          : tables
Target            :
LinkType          :
Name              : tables
Parent            : 20180625
Exists            : True
Root              : /
FullName          : /Users/daichi/Documents/powershell/20180625/tables
Extension         :
CreationTime      : 2018/07/03 18:03:27
CreationTimeUtc   : 2018/07/03 9:03:27
LastAccessTime    : 2018/07/03 18:03:27
LastAccessTimeUtc : 2018/07/03 9:03:27
LastWriteTime     : 2018/07/03 18:03:27
LastWriteTimeUtc  : 2018/07/03 9:03:27
Attributes        : Directory

PSPath            : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625/Makefile
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625
PSChildName       : Makefile
PSDrive           : /
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : ------
VersionInfo       : File:             /Users/daichi/Documents/powershell/201806
                    25/Makefile
                    InternalName:
                    OriginalFilename:
                    FileVersion:
                    FileDescription:
                    Product:
                    ProductVersion:
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:

BaseName          : Makefile
Target            :
LinkType          :
Name              : Makefile
Length            : 557
DirectoryName     : /Users/daichi/Documents/powershell/20180625
Directory         : /Users/daichi/Documents/powershell/20180625
IsReadOnly        : False
Exists            : True
FullName          : /Users/daichi/Documents/powershell/20180625/Makefile
Extension         :
CreationTime      : 2018/07/03 18:03:27
CreationTimeUtc   : 2018/07/03 9:03:27
LastAccessTime    : 2018/07/03 18:13:53
LastAccessTimeUtc : 2018/07/03 9:13:53
LastWriteTime     : 2018/07/03 18:03:27
LastWriteTimeUtc  : 2018/07/03 9:03:27
Attributes        : Normal

PSPath            : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625/typescript.xml
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::/Users/daichi/Documen
                    ts/powershell/20180625
PSChildName       : typescript.xml
PSDrive           : /
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : ------
VersionInfo       : File:             /Users/daichi/Documents/powershell/201806
                    25/typescript.xml
                    InternalName:
                    OriginalFilename:
                    FileVersion:
                    FileDescription:
                    Product:
                    ProductVersion:
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:

BaseName          : typescript
Target            :
LinkType          :
Name              : typescript.xml
Length            : 6088
DirectoryName     : /Users/daichi/Documents/powershell/20180625
Directory         : /Users/daichi/Documents/powershell/20180625
IsReadOnly        : False
Exists            : True
FullName          : /Users/daichi/Documents/powershell/20180625/typescript.xml
Extension         : .xml
CreationTime      : 2018/07/03 18:03:27
CreationTimeUtc   : 2018/07/03 9:03:27
LastAccessTime    : 2018/07/03 18:13:53
LastAccessTimeUtc : 2018/07/03 9:13:53
LastWriteTime     : 2018/07/03 18:03:27
LastWriteTimeUtc  : 2018/07/03 9:03:27
Attributes        : Normal



PS /Users/daichi/Documents/powershell/20180625>

Format-Listコマンドレットを経由するとそれぞれのプロパティが1行ごとに表示されるようになるので、場合によってはこちらの方がコマンドレットのデフォルトの出力よりも扱いやすく読みやすいこともある。

流れてくるデータの中身を見る方法としてひとつ覚えておいてもらえればと思う。

参考資料