その1、その2ではイベントログをcsv形式にエクスポートしてみた。
今回、その3では条件に一致するファイル一覧を取得してみる。
コマンドプロンプトなら最初に思いつくのがdirコマンド。
PowerShellでも、dirはget-childitemのエイリアスに標準で設定されているが、勉強なので出来るだけエイリアスや省略を使わずに使用してみる。
まずはエイリアスの確認。
従来のコマンドユーザのために、dirはget-childitemのエイリアスになっている。
PS C:\> alias dir
CommandType Name Definition ----------- ---- ---------- Alias dir Get-ChildItem |
UNIXやLinuxユーザのために、lsもget-childitemのエイリアスになっている。
PS C:\> alias ls
CommandType Name Definition ----------- ---- ---------- Alias ls Get-ChildItem |
何も指定せずにget-childitemを実行すると、カレントディレクトリ直下のフォルダやファイルの一覧が表示される。
PS C:\> get-childitem
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\
Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2008/05/18 18:57 Intel d---- 2008/01/21 11:30 PerfLogs d-r-- 2009/09/06 22:30 Program Files d-r-- 2008/05/18 0:34 Users d---- 2009/08/08 23:10 Windows -a--- 2006/09/19 6:43 24 autoexec.bat -ar-s 2008/05/18 17:13 8192 BOOTSECT.BAK -a--- 2006/09/19 6:43 10 config.sys |
モードはファイルの属性で、5桁で構成されている。
このモードの説明は、get-help Get-ChildItem -detailedで表示される。
1. d (ディレクトリ)
2. a (アーカイブ)
3. r (読み取り専用)
4. h (隠しファイル)
5. s (システム ファイル)
自分のユーザプロファイルのフォルダおよびその配下のサブフォルダから、拡張子が.pngのファイルの一覧を取得してみる。
-recurseは再帰的、この場合はすべてのサブフォルダを含める意味。
サブフォルダごとに分かれて表示されるのは、コマンドプロンプトでdirを/s付きで実行したときみたいだね。
PS C:\> $userprofile = $env:userprofile PS C:\> echo $userprofile C:\Users\norimaki PS C:\> get-childitem -recurse -path $userprofile -include *.png
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Downloads\TF_syoubu_icon\勝負アイコン\icon_png
Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2009/05/01 22:38 6629 ball.png -a--- 2009/05/01 22:38 9223 bat.png -a--- 2009/05/01 22:38 11677 globe.png -a--- 2009/05/01 22:38 9808 helmet.png -a--- 2009/05/01 22:38 8592 logo.png
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Pictures
Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2008/05/18 22:13 9312 corega01.png -a--- 2008/05/18 22:14 9416 corega02.png -a--- 2008/05/18 22:16 12624 corega03a.png -a--- 2008/05/18 22:47 19567 corega03b.png -a--- 2008/05/18 22:46 49251 corega04.png -a--- 2009/05/31 22:18 70911 無題.png |
ここでファイルの属性の項目を確認しよう。
その1のときと同様に、抽出したファイルの情報をformat-listコマンドレットにパイプで送る。
PS C:\> $userprofile = $env:userprofile PS C:\> get-childitem -recurse -path $userprofile -include logo.png |format-list
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Downloads\TF_syoubu_icon\勝負アイコン\icon_png
Name : logo.png Length : 8592 CreationTime : 2009/04/23 17:36:04 LastWriteTime : 2009/05/01 22:38:52 LastAccessTime : 2009/04/23 17:36:04 VersionInfo : |
CreationTimeはファイルの作成日時
LastWriteTimeはファイルの更新日時
LastAccessTimeはファイルの最終アクセス日時
おお、これはいいね。
ファイルの更新日だけではなく、アクセス日でファイルを抽出したり出来そうだ。
ファイルサーバ内では更新されなくても読み取りされているファイルもあり、「最近使っていないファイルを抽出」が簡単に出来そうな気配がするね。
では自分のユーザプロファイルのおよびその配下のサブフォルダから、ファイル名が「写真」で始まり、拡張子が.lzhのファイルの詳細情報を取得してみる。
PS C:\> $userprofile = $env:userprofile PS C:\> get-childitem -recurse -path $userprofile -include 写真*.lzh |format-list
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Documents\受信したファイル
Name : 写真20090809.lzh Length : 6703041 CreationTime : 2009/08/09 23:14:21 LastWriteTime : 2009/08/09 23:16:32 LastAccessTime : 2009/08/09 23:14:21 VersionInfo :
Name : 写真20090816.lzh Length : 1587869 CreationTime : 2009/08/16 21:22:24 LastWriteTime : 2009/08/16 21:22:57 LastAccessTime : 2009/08/16 21:22:24 VersionInfo : |
そうしたら同じフォルダから、最終アクセス日時が2009/08/09 23:15:00よりも古いファイルを抽出。
更新日時ではなく、最終アクセス日時で抽出されたことがわかる。
PS C:\> $userprofile = $env:userprofile PS C:\> get-childitem -recurse -path $userprofile -include 写真*.lzh |Where-Object {$_.LastAccessTime -lt "2009/08/15 23:15:00"} |format-list
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Documents\受信したファイル
Name : 写真20090809.lzh Length : 6703041 CreationTime : 2009/08/09 23:14:21 LastWriteTime : 2009/08/09 23:16:32 LastAccessTime : 2009/08/09 23:14:21 VersionInfo : |
今度は最終アクセス日時が2009/08/15 23:15:00と同じか、それより新しいファイル。
PS C:\> $userprofile = $env:userprofile PS C:\> get-childitem -recurse -path $userprofile -include 写真*.lzh |Where-Object {$_.LastAccessTime -ge "2009/08/15 23:15:00"} |format-list
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Documents\受信したファイル
Name : 写真20090816.lzh Length : 1587869 CreationTime : 2009/08/16 21:22:24 LastWriteTime : 2009/08/16 21:22:57 LastAccessTime : 2009/08/16 21:22:24 VersionInfo : |
ユーザプロファイル以下で、拡張子が.zip、ファイルサイズが2MBよりも小さく、最終アクセス日時が2009年6月1日と同じかそれよりも新しい。
PS C:\> $userprofile = $env:userprofile PS C:\> get-childitem -recurse -path $userprofile -include *.zip |Where-Object {$_.Length -lt 2097152} |Where-Object {$_.LastAccessTime -ge "2009/06/01"} |format-list
ディレクトリ: Microsoft.PowerShell.Core\FileSystem::C:\Users\norimaki\Downloads
Name : Hyper-V_Security_Guide_pdf.zip Length : 1871904 CreationTime : 2009/07/06 2:41:05 LastWriteTime : 2009/07/06 2:41:08 LastAccessTime : 2009/07/06 2:40:31 VersionInfo : |
条件はさっきと同じで、抽出結果を%temp%の下にcsv形式ファイルでエクスポートする。
PS C:\> $userprofile = $env:userprofile PS C:\> get-childitem -recurse -path $userprofile -include *.zip |Where-Object {$_.Length -lt 2097152} |Where-Object {$_.LastAccessTime -ge "2009/06/01"} |export-csv -encoding default -path $temp\File-List.csv |
エクスポートされたcsvファイルを見てみるとわかるが、format-listコマンドレットにパイプするよりも、もっと多くの属性が含まれているね。
今日はこれくらいにしておこう。