指定フォルダ以下のアイテムを再帰的に総ざらえして「ビデオ」ファイルの「ファイルサイズ」、「時間」、「フレーム高」、「フレーム幅」を読み取って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
まずは例の機能を実装へ。
それが落ち着いたら汎用的に使えるバージョンを作ってもいいかー。
'以下、末尾までスクリプト
'
''実行例: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 件のコメント:
コメントを投稿