DOSのコマンドで指定フォルダ以下の指定拡張子ファイルの一覧を取得するはこんな感じになる。
dir a:\*.mp4 /s /b /on > dirAmp4.txt
dir a:\*.avi /s /b /on > dirAavi.txt
dir b:\*.mp4 /s /b /on > dirBmp4.txt
dir b:\*.avi /s /b /on > dirBavi.txt
非常にシンプルで美しい。。。。。が、これをVBScriptで実現しようと、
【VBScript Tips】 フォルダの内容を再帰的に取得する。を参考に上記のDOSコマンドと同じような処理を行うようなスクリプトを組んだで、テスト実行してみたが、エラーで停止してしまうorz
↓な感じ。
『C:\DOGA\!\FileSaikiSerch004.vbs(67, 2) Microsoft VBScript 実行時エラー: 書き込み
できません。』
原因を調べてみたら、今回使用したFolder オブジェクトの"SubFolders"プロパティが、「隠しフォルダやシステム フォルダ」にもアクセスしようとしてエラーを発生させていたらしい。
このようにフォルダオプションでは通常「表示しない」設定の見えないフォルダ。
プロパティで何か制御できないのかなーと調べてみたけど判らん訳で、あまり使いたくなかったが、on error resume next の出番となりました。
後、個人的に使用しているアプリが ピリオドが一文字目のフォルダを作ってたのでこれも無視したい。
今回検索するフォルダは自分が作成したフォルダなのでフォルダの命名規約に一文字目は $ や ピリオドを使わない前提で、ファイル一文字目が $ や ピリオドのフォルダは無視、とベタベタな回避方法に。 もっとスマートな方法ないもんかいなorz。
Dirコマンドとエクスプローラの検索により、"*.avi" と "*.mp4" ファイル数をチェックして一致を確認。最後に完成したマクロを実行してファイル数を一致を確認して、この機能は一先ず完成。
実行例:
cscript FileSaikiSerch004.vbs A:
cscript FileSaikiSerch004.vbs A: > a004.txt
実行結果:
フォルダ名、ファイル名 しか参照してないから、ほどほどの早さになったかと。 まぁ、ディスク性能にもよるけどね。
この速度が、「あの処理」までのVBScript (その3) 指定ファイルの指定プロパティを抜き出し Echo する。を組み込んだらドーなるやら。
'以下、末尾までスクリプトです。 ではまた~ノシ:
'
'実行例:Cscript FileSaikiSerch004.vbs ディレクトリ名
'
'
Option Explicit
'処理概要
' 指定フォルダから再帰的にファイル(.mp4,.avi)を検索する。
Option Explicit
Dim oSFso , oAGS , oShellA
Dim sWRITE_LINE
Dim sPATH_ITEM0
'処理カウント
Dim iCONV_COUNTAll
'フォルダ・ファイル操作
Set oSFso = WScript.CreateObject("Scripting.FileSystemObject")
'ファイル属性確認
'再帰的に呼び出すので、宣言をメインループより出した
Set oShellA = WScript.CreateObject("Shell.Application")
'パラメータ確認用
Set oAGS = WScript.Arguments
If oAGS.count = 1 Then
'置換用に元パス名保持
sPATH_ITEM0 = oAGS.item(0)
'処理カウント リセット
iCONV_COUNTAll = 0
If oSFso.FolderExists( sPATH_ITEM0 ) = True Then
'メインループ実行
CALL GET_FOLDERMOVIE( sPATH_ITEM0 )
'処理終了 処理別カウント
WScript.Echo "####処理終了 対象.mp4 .avi合計####"
WScript.Echo sPATH_ITEM0 & vbTab & "ALL :" & iCONV_COUNTAll
WScript.Echo "##################################"
Else
Wscript.Echo "引数が不正です。" & vbTab & oAGS.item(0)
End if
Else
Wscript.Echo "引数が不正です。" & vbTab & "実行例:Cscript FileSaikiSerch004.vbs ディレクトリ名"
End If
'終了処理
Set oAgs = Nothing
Set oSFso = Nothing
Set oShellA = Nothing
Wscript.Quit
Sub GET_FOLDERMOVIE(psPATH)
Dim cSFolder,oSFolder,oTemp,cFiler
Dim sMovie
Set cSFolder = oSFso.GetFolder(psPATH)
Set oSFolder = cSFolder.SubFolders
'エラーでも実行
on error resume next
For Each oTemp In oSFolder
sMovie = Left(oTemp.Name,1)
if sMovie ="$" or sMovie ="." then
else
'WScript.Echo psPATH & "\" & oTemp.Name
GET_FOLDERMOVIE(psPATH & "\" & oTemp.Name)
end if
Next
Set cFiler = cSFolder.Files
For Each oTemp In cFiler
sMovie = Left(oTemp.Name,1)
if sMovie ="$" or sMovie ="." then
else
sMovie = Right(LCase(oTemp.Name) , 4)
If (sMovie = ".mp4" or sMovie = ".avi") Then
iCONV_COUNTAll = iCONV_COUNTAll + 1
WScript.Echo psPATH & "\" & oTemp.Name
End if
end if
Next
'エラークリア
err.clear
on error goto 0
'終了処理
Set cSFolder = Nothing
Set oSFolder = Nothing
Set oTemp = Nothing
Set cFiler = Nothing
End Sub
0 件のコメント:
コメントを投稿