2014年1月2日木曜日

「あの処理」までのVBScript (その4) 指定フォルダから再帰的にファイル(.mp4,.avi)を検索する。

 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

実行結果:


 フォルダ名、ファイル名 しか参照してないから、ほどほどの早さになったかと。 まぁ、ディスク性能にもよるけどね。

'以下、末尾までスクリプトです。 ではまた~ノシ
'
'実行例:Cscript FileSaikiSerch004.vbs ディレクトリ名
'
'処理概要
' 指定フォルダから再帰的にファイル(.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 件のコメント:

コメントを投稿