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行ごとに表示されるようになるので、場合によってはこちらの方がコマンドレットのデフォルトの出力よりも扱いやすく読みやすいこともある。
流れてくるデータの中身を見る方法としてひとつ覚えておいてもらえればと思う。
参考資料
- Microsoft PowerShell Module Browser
- Microsoft PowerShell6|Object Pipeline
- Microsoft PowerShell6|Understanding the Windows PowerShell Pipeline
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Format-List
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Format-Table
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Format-Wide
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Format-Hex
- Microsoft PowerShell6|Microsoft.PowerShell.Utility|Format-Custom