2014年1月3日金曜日

「あの処理」までのVBScript (その7)◎指定フォルダからアイテムを再帰的に総ざらえして、「ビデオ」ファイルの指定プロパティを出力する。

 指定フォルダ以下のアイテムを再帰的に総ざらえして「ビデオ」ファイルの「ファイルサイズ」、「時間」、「フレーム高」、「フレーム幅」を読み取ってEchoします。 ファイルのプロパティにアクセスしているため、実行速度は単なるファイル検索に比べて遅いです。

 タブで区切っているので、ファイルに出力してやれば、エクセルなどに貼り付けて利用なども容易です。

実行例:
 Cscript SeekFolderShowMovieDetails007.vbs {パス名}
 Cscript SeekFolderShowMovieDetails007.vbs a: 
 Cscript SeekFolderShowMovieDetails007.vbs A:\#アニメいろばら > 0071.txt




処理について:
 当初の拡張子を参照していたが、現在は見ないようになっている。今回は分類」”ビデオ”に限定して出力しているが、抽出条件や表示項目を変えれば別のアイテムも抜き出す事が出来る、、、と思う。


今後について:
 まずは例の機能を実装へ。
 それが落ち着いたら汎用的に使えるバージョンを作ってもいいかー。



'以下、末尾までスクリプト
'
'
'実行例:Cscript SeekFolderShowMovieDetails007.vbs ディレクトリ名
'
Option Explicit
'
'処理概要
' 指定フォルダからアイテムを再帰的に総ざらえして、指定分類"ビデオ"ファイルの指定プロパティを出力する。
'
'出力指定プロパティ
' 名前 サイズ 長さ フレーム高 フレーム幅
'
'
Dim oSFso , oAGS , oShellA

Dim sWRITE_LINE
Dim sPATH_ITEM0

'処理カウント
Dim iCONV_COUNTAll
Dim iFOLDER_COUNT

'フォルダ・ファイル操作
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

'フォルダカウント リセット
iFOLDER_COUNT = 0

If oSFso.FolderExists( sPATH_ITEM0 ) = True  Then

'メインループ実行
   CALL GET_FOLDERMOVIE( sPATH_ITEM0 )

'処理終了 処理別カウント
WScript.Echo ""
WScript.Echo "####処理終了 処理別カウント####"
WScript.Echo vbTab & "処理ファイル数:" & iCONV_COUNTAll 
WScript.Echo vbTab & "検索フォルダ数:" & iFOLDER_COUNT
WScript.Echo "################################"
Else
   Wscript.Echo "引数が不正です。" & vbTab & oAGS.item(0)  

End if
Else
    Wscript.Echo "引数が不正です。" & vbTab & "実行例:Cscript SeekFolderShowMovieDetails007.vbs ディレクトリ名 "

End If


'終了処理
Set oAgs = Nothing
Set oSFso = Nothing
Set oShellA = Nothing
Wscript.Quit 


'= = = = = = = = = = = = = = = = = = = = = = = = 
'Sub GET_FOLDERMOVIE(psPATH)
'
'処理概要
' 指定フォルダから再帰的にフォルダを検索する。
'
'IN
' psPATH 検索元パス
'
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
'初回はルートフォルダ
if iFOLDER_COUNT = 0 then
iFOLDER_COUNT=iFOLDER_COUNT+1
Wscript.Echo iFOLDER_COUNT & ")" & psPATH

iCONV_COUNTAll = iSHOW_FileDetails("ビデオ" , psPATH) + iCONV_COUNTAll 

end if

'以後、サブフォルダフォルダ
iFOLDER_COUNT=iFOLDER_COUNT+1
Wscript.Echo iFOLDER_COUNT & ")" & psPATH & "\" & oTemp.Name

iCONV_COUNTAll = iSHOW_FileDetails("ビデオ" , psPATH & "\" & oTemp.Name) + iCONV_COUNTAll 

'サブフォルダー検索
   GET_FOLDERMOVIE(psPATH & "\" & oTemp.Name)
end if 

Next

'サブフォルダー検索のみに使用
Set cFiler = cSFolder.Files
For Each oTemp In cFiler

Next

'エラークリア
err.clear
on error goto 0

'終了処理
Set cSFolder = Nothing
Set oSFolder = Nothing
Set oTemp = Nothing
Set cFiler = Nothing
End Sub



'= = = = = = = = = = = = = = = = = = = = = = = = 
'Function iSHOW_FileDetails(psBunrui , psFolder)
'
'処理概要
' 指定分類"ビデオ"ファイルの指定プロパティをEchoする
'
'IN
' psBunrui ファイル分類 ex.ビデオ
' psFolder 抽出するフォルダパス名
'
'OUT
' Return 参照ファイル数"ビデオ"
'
Function iSHOW_FileDetails(psBunrui , psFolder)
Const PARA_COUNT = 512
    Dim rHeaders(512)

    Dim oNsFolder 'フォルダオブジェクト
    Dim oItem 'フォルダ内特定アイテムオブジェクト
    Dim iPara 'パラメータインデックス

    Dim iFileCount'処理件数カウント

Dim idxN ' 名前
Dim idxS ' サイズ
Dim idxB ' 分類
Dim idxL ' 長さ
Dim idxH ' フレーム高
Dim idxW ' フレーム幅

'指定フォルダのNamespace取得

    Set oNsFolder = oShellA.Namespace(psFolder)

'処理件数カウント初期化
iFileCount = 0

'詳細ラベルの判定初期化
idxN = 0 ' 名前
idxS = 0 ' サイズ
idxB = 0 ' 分類
idxL = 0 ' 長さ
idxH = 0 ' フレーム高
idxW = 0 ' フレーム幅

'詳細ラベルの取得
For iPara = 0 to (PARA_COUNT-1)
rHeaders(iPara) = oNsFolder.GetDetailsOf(oNsFolder.Items, iPara)

Select Case oNsFolder.GetDetailsOf(oNsFolder.Items, iPara)

case "名前"
idxN = iPara

case "サイズ"
idxS = iPara

case "分類"
idxB = iPara

case "長さ"
idxL = iPara

case "フレーム高"
idxH = iPara

case "フレーム幅"
idxW = iPara

end select

'名前以外判定
If idxS > 0  and idxB > 0  and idxL > 0  and idxH > 0  and idxW > 0 then
Exit For
End if
Next

'名前以外判定
If idxS > 0  and idxB > 0  and idxL > 0  and idxH > 0  and idxW > 0 then

Wscript.Echo vbTab & rHeaders(idxN)  & vbTab &  rHeaders(idxS)  & vbTab &  rHeaders(idxL)  & vbTab &  rHeaders(idxH)  & vbTab &  rHeaders(idxW) 

'詳細情報の取得 PARA_COUNT まで検索して保管情報を抜き出す
For Each oItem in oNsFolder.Items

'指定の分類のみ出力対象とする。
If oNsFolder.GetDetailsOf(oItem, idxB) = psBunrui Then

iFileCount = iFileCount + 1
With oNsFolder
Wscript.Echo iFileCount & vbTab & .GetDetailsOf(oItem, idxN) & vbTab &  .GetDetailsOf(oItem, idxS) & vbTab & .GetDetailsOf(oItem, idxL) & vbTab &  .GetDetailsOf(oItem, idxH) & vbTab &  .GetDetailsOf(oItem, idxW) 
End with
End if

   Next

Wscript.Echo ""
End if

iSHOW_FileDetails = iFileCount

    Set oNsFolder = Nothing
    Set oItem = Nothing
End Function

0 件のコメント:

コメントを投稿