コマンドレットはオブジェクトを返す(PowerShell入門)

この記事は以前 http://blog.hiros-dot.net/ で書いたものです。 

CMD.exeで dir と入力した場合と、PowerShellでdirと入力した結果は見た目はほぼ同じです。

以下はCMD.exeでのdirコマンド

c:\Work>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 14F3-DBDF です
c:\Work のディレクトリ
2008/04/01  22:54              .
2008/04/01  22:54              ..
2008/03/07  18:39                28 1stList.csv
2008/04/01  22:53            17,226 CommandList.txt
2008/04/06  22:15            23,848 PSCmd.txt
2008/03/20  22:50               880 replace.ps1
2008/03/08  00:10                89 Select.csv
5 個のファイル              42,071 バイト
2 個のディレクトリ  67,029,467,136 バイトの空き領域

 以下がPowerShellでのdir

PS C:\Work> dir
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Work
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2008/03/07     18:39         28 1stList.csv
-a---        2008/04/01     22:53      17226 CommandList.txt
-a---        2008/04/06     22:15      23848 PSCmd.txt
-a---        2008/03/20     22:50        880 replace.ps1
-a---        2008/03/08      0:10         89 Select.csv

 

PowerShellでの例を見ると、各項目の名称が一番上に表示されていたり、Modeが表示されていたりしていますが、単に結果を文字で返していると思っていませんか?

実はPowerShellでの結果は文字ではなく、すべてオブジェクトです。

そうはいっても表示されるのは文字なので、オブジェクトを返すことになんのメリットがあるかを実感できないのではないでしょうか?

では、Get-Memberコマンドレットを使用して dirコマンド(実際にはdirはGet-ChildItemのエイリアスです)のオブジェクトを見てみましょう。

PS C:\Work> dir | Get-Member
TypeName: System.IO.FileInfo
Name                      MemberType     Definition
----                      ----------     ----------
AppendText                Method         System.IO.StreamWriter AppendText()
CopyTo                    Method         System.IO.FileInfo CopyTo(String destFileName...
Create                    Method         System.IO.FileStream Create()
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(T...
CreateText                Method         System.IO.StreamWriter CreateText()
Decrypt                   Method         System.Void Decrypt()
Delete                    Method         System.Void Delete()
Encrypt                   Method         System.Void Encrypt()
Equals                    Method         System.Boolean Equals(Object obj)
GetAccessControl          Method         System.Security.AccessControl.FileSecurity Ge...
GetHashCode               Method         System.Int32 GetHashCode()
GetLifetimeService        Method         System.Object GetLifetimeService()
GetObjectData             Method         System.Void GetObjectData(SerializationInfo i...
GetType                   Method         System.Type GetType()
get_Attributes            Method         System.IO.FileAttributes get_Attributes()
get_CreationTime          Method         System.DateTime get_CreationTime()

 

長いので途中省略しましたが、CMD.exeのdirとは違い、多くの情報を取得することがわかっていただけたでしょうか?

たとえば、dirコマンド(実際にはGet-ChildItem)はfullnameというプロパティがあるのですか、このプロパティを使用するとファイル名のフルパスを取得することができます。

以下がdirが返すオブジェクトであるfullnameプロパティを使用してフルパスを取得する例です(Select-Objectは後日説明したいと思います)

PS C:\Work> dir | Select-Object {$_.fullname}
$_.fullname
-----------
C:\Work\1stList.csv
C:\Work\CommandList.txt
C:\Work\PSCmd.txt
C:\Work\replace.ps1
C:\Work\Select.csv

  このようにPowerShellではオブジェクトを返すため、必要な情報だけを抜き出して表示したり、さらに多くの情報を表示させたり、取得した結果を用いて計算したりすることが可能です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です