フルパスでサブディレクトリも含めファイルリストを取得しつつファイルの各種情報を取得したい時が人にはあります。
1万ファイル近くあるコンテンツディレクトリの変更管理監査をしなさい、とか言われた日には自動化でもしないとやっていられません。
フルパスだけであれば
C:\temp\gara>Dir /B /S C:\temp\gara\data C:\temp\gara\garapon.ini C:\temp\gara\temp C:\temp\gara\users C:\temp\gara\users.txt
で取得できるのだけど、これだとファイルサイズとか最終更新日とかわからない。ついでにディレクトリも出てきてしまう。
Dirコマンドとか、色々調べたのだけどWin標準コマンドだけでは出来ないっぽい。
Linuxなら色々やり方あるのになぁとゲイツを呪ってもしょうがないのでVBSで作ってみた
VBSならファイルオブジェクトでデータが取れるので後はやりたいようにやればいい。
Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objInFile = objFileSys.OpenTextFile(strInFileName) objFile.Size 'サイズ objFile.Type '種類 objFile.DateCreated '作成日 objFile.DateLastAccessed '最終アクセス日 objFile.DateLastModified '最終更新日
んで、後はこれをサブフォルダまで順繰りに見ていけばよいのですが
順繰りにみてくのがめんどかったのでさっきの「Dir /B /S」でファイルリストを作って
そのリストを読み込みながらファイルの情報を取得するようにした。
GetAllFileSize.cmd
Dir /B /S C:\temp\gara > list.txt getFileInfo.vbs
んでそこから呼び出されるVBS
getFileInfo.vbs
Option Explicit Dim objFileSys Dim objFile Dim objInFile Dim objOutFile Dim strLine Dim strInFileName Dim strOutFileName Dim strNow '読み込みファイル名と結果ファイル名 strInFileName = "list.txt" strNow = Now strOutFileName = Year(strNow) & Right("0" & Month(strNow), 2) & Right("0" & Day(strNow), 2) & "_" & Right("0" & Hour(Now), 2) & Right("0" & Minute(strNow), 2) & "_fileInfo.txt" Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objInFile = objFileSys.OpenTextFile(strInFileName) objFileSys.CreateTextFile strOutFileName Set objOutFile = objFileSys.OpenTextFile(strOutFileName,8) 'ファイルの内容を全部読み終えるまでループ Do Until objInFile.AtEndOfStream = true 'ファイルの内容を1行ずつ読み込む strLine = objInFile.ReadLine If objFileSys.FileExists(strLine) Then Set objFile = objFileSys.GetFile(strLine) 'ファイル名+ファイルサイズ+最終更新日を表示 objOutFile.WriteLine strLine & chr(9) & objFile.Size & chr(9) & objFile.DateLastModified End If Loop objInFile.Close objOutFile.Close
すると指定ディレクトリ以下のサブディレクトリ配下全てのファイルのファイルサイズ、最終更新日が出るようになりました。
C:\temp\gara>GetAllFileSize.cmd C:\temp\gara\garapon.ini 1148 2009/01/11 11:07:04 C:\temp\gara\users.txt 466 2009/01/11 11:07:04
あとはこれを定期的に取得してDiffをとれば何が変わったか分かりますね。
問題はまだまだVBSが重いってことだな。