フルパスでサブディレクトリも含めファイルリストを取得しつつファイルの各種情報を取得したい時が人にはあります。
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が重いってことだな。