Category Archives: PowerShell

PowerShellでstatもどきを作る

前回から、Windowsのファイルのタイムスタンプについて学習していますが、
各タイムスタンプを確認するのに、dir /tc、dir /ta、dir /twを毎回入力するのが手間なので、PowerShellでコマンドを作っておきます。

タイムスタンプは、オブジェクト(ファイル)が持っているプロパティで確認できます。
作成日時なら、CreationTime
最終アクセス日時なら、LastAccessTime
最終更新日時なら、LastWriteTime
を、以下のように表示させて値を見ることができます。

C:\Users\takk\tmp>echo HELLO > bb.txt

C:\Users\takk\tmp>powershell "(gp bb.txt).lastwritetime"

2018年6月16日 14:24:44



C:\Users\takk\tmp>

上記の時間は、dir /twと一致するでしょうか。

C:\Users\takk\tmp>dir /tw
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は B402-CA61 です

 C:\Users\takk\tmp のディレクトリ

2018/06/16  14:24    <DIR>          .
2018/06/16  14:24    <DIR>          ..
2018/06/16  14:24                 8 bb.txt
               1 個のファイル                   8 バイト
               2 個のディレクトリ  136,361,189,376 バイトの空き領域

C:\Users\takk\tmp>

同じ時間になりました。問題ないですね。

さて、各タイムスタンプをまとめて表示するための関数を作りましょう。
毎回powershellコマンドを実行するのも面倒なので、PowerShellに入ります。

C:\Users\takk\tmp>powershell
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS C:\Users\takk\tmp>

各タイムスタンプを並べて表示する関数。

function stat($f){
(gp $f).creationtime
(gp $f).lastaccesstime
(gp $f).lastwritetime
}

上をPowerShellのコンソールに貼り付けると、関数が定義されます。
実行すると、

PS C:\Users\takk\tmp> function stat($f){
>> (gp $f).creationtime
>> (gp $f).lastaccesstime
>> (gp $f).lastwritetime
>> }
>>
PS C:\Users\takk\tmp> stat bb.txt

2018年6月16日 14:24:44
2018年6月16日 14:24:44
2018年6月16日 14:24:44


PS C:\Users\takk\tmp>

各タイムスタンプが表示されました。
見出しがないので、どの日時が何の日時なのか分かりにくいですね。
見出しをつけます。

function stat($f){
"作成         {0}" -f (gp $f).creationtime
"最終アクセス {0}" -f (gp $f).lastaccesstime
"最終更新     {0}" -f (gp $f).lastwritetime
}
PS C:\Users\takk\tmp> function stat($f){
>> "作成         {0}" -f (gp $f).creationtime
>> "最終アクセス {0}" -f (gp $f).lastaccesstime
>> "最終更新     {0}" -f (gp $f).lastwritetime
>> }
>>
PS C:\Users\takk\tmp> stat bb.txt
作成         2018/06/16 14:24:44
最終アクセス 2018/06/16 14:24:44
最終更新     2018/06/16 14:24:44
PS C:\Users\takk\tmp>

分かりやすくなりました。

さてLinuxのstatコマンドは、このような表示でした。

takk@deb9:~/tmp$ stat a
  File: a
  Size: 13              Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d      Inode: 546991      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-06-14 20:48:37.280000000 +0900
Modify: 2018-06-14 20:47:55.256000000 +0900
Change: 2018-06-14 20:47:55.256000000 +0900
 Birth: -
takk@deb9:~/tmp$

今回作るstatもどきも、タイムスタンプだけでは寂しいので、ファイル名と、サイズぐらいは表示するように修正します。

ここで、オブジェクト(ファイル)に、どのようなプロパティが存在するか確認してみます。
get-memberで、各メンバが表示できますが、このうちのMemberTypeがPropertyとなっている項目がプロパティです。

PS C:\Users\takk\tmp> gp bb.txt | get-member

   TypeName: System.IO.FileInfo

Name                      MemberType     Definition                            
----                      ----------     ----------                            
Mode                      CodeProperty   System.String Mode{get=Mode;}         
AppendText                Method         System.IO.StreamWriter AppendText()   
CopyTo                    Method         System.IO.FileInfo CopyTo(string de...
Create                    Method         System.IO.FileStream Create()         
CreateObjRef              Method         System.Runtime.Remoting.ObjRef Crea...
CreateText                Method         System.IO.StreamWriter CreateText()   
Decrypt                   Method         void Decrypt()                        
Delete                    Method         void Delete()                         
Encrypt                   Method         void Encrypt()                        
Equals                    Method         bool Equals(System.Object obj)        
GetAccessControl          Method         System.Security.AccessControl.FileS...
GetHashCode               Method         int GetHashCode()                     
GetLifetimeService        Method         System.Object GetLifetimeService()    
GetObjectData             Method         void GetObjectData(System.Runtime.S...
GetType                   Method         type GetType()                        
InitializeLifetimeService Method         System.Object InitializeLifetimeSer...
MoveTo                    Method         void MoveTo(string destFileName)      
Open                      Method         System.IO.FileStream Open(System.IO...
OpenRead                  Method         System.IO.FileStream OpenRead()       
OpenText                  Method         System.IO.StreamReader OpenText()     
OpenWrite                 Method         System.IO.FileStream OpenWrite()      
Refresh                   Method         void Refresh()                        
Replace                   Method         System.IO.FileInfo Replace(string d...
SetAccessControl          Method         void SetAccessControl(System.Securi...
ToString                  Method         string ToString()                     
PSChildName               NoteProperty   System.String PSChildName=aa.txt      
PSDrive                   NoteProperty   System.Management.Automation.PSDriv...
PSParentPath              NoteProperty   System.String PSParentPath=Microsof...
PSPath                    NoteProperty   System.String PSPath=Microsoft.Powe...
PSProvider                NoteProperty   System.Management.Automation.Provid...
Attributes                Property       System.IO.FileAttributes Attributes...
CreationTime              Property       datetime CreationTime {get;set;}      
CreationTimeUtc           Property       datetime CreationTimeUtc {get;set;}   
Directory                 Property       System.IO.DirectoryInfo Directory {...
DirectoryName             Property       string DirectoryName {get;}           
Exists                    Property       bool Exists {get;}                    
Extension                 Property       string Extension {get;}               
FullName                  Property       string FullName {get;}                
IsReadOnly                Property       bool IsReadOnly {get;set;}            
LastAccessTime            Property       datetime LastAccessTime {get;set;}    
LastAccessTimeUtc         Property       datetime LastAccessTimeUtc {get;set;} 
LastWriteTime             Property       datetime LastWriteTime {get;set;}     
LastWriteTimeUtc          Property       datetime LastWriteTimeUtc {get;set;}  
Length                    Property       long Length {get;}                    
Name                      Property       string Name {get;}                    
BaseName                  ScriptProperty System.Object BaseName {get=if ($th...
VersionInfo               ScriptProperty System.Object VersionInfo {get=[Sys...


PS C:\Users\takk\tmp> 

さきほどのLastAccessTime等もありますね。

statもどきに追加したいのは、ファイル名と、サイズなので、該当するプロパティが、
Name、Lengthになります。

では、関数を作ります。

function stat($f){
"ファイル名   {0}" -f (gp $f).name
"サイズ       {0}" -f (gp $f).length
"作成         {0}" -f (gp $f).creationtime
"最終アクセス {0}" -f (gp $f).lastaccesstime
"最終更新     {0}" -f (gp $f).lastwritetime
}

貼り付けて、実行してみましょう。

PS C:\Users\takk\tmp> function stat($f){
>> "ファイル名   {0}" -f (gp $f).name
>> "サイズ       {0}" -f (gp $f).length
>> "作成         {0}" -f (gp $f).creationtime
>> "最終アクセス {0}" -f (gp $f).lastaccesstime
>> "最終更新     {0}" -f (gp $f).lastwritetime
>> }
>>
PS C:\Users\takk\tmp>
PS C:\Users\takk\tmp> stat bb.txt
ファイル名   bb.txt
サイズ       8
作成         2018/06/16 14:24:44
最終アクセス 2018/06/16 14:24:44
最終更新     2018/06/16 14:24:44
PS C:\Users\takk\tmp>

完成です。