2014年1月3日金曜日

「あの処理」までのVBScript (その7の1)no8 指定フォルダからアイテムを再帰的に検索して、"ビデオ"と不明ファイルの指定プロパティを出力する。

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


の調整版。「あの処理」を追加するためにカウントするファイル調整とか、取得したプロパティの集計とかを追加しています。

処理について:
 「標準的なMP4動画ファイルばかり集まったフォルダ」で動くようにしてるつもりなので、あまり高度な事をするつもりはありません。

処理は主に以下の事をしています。
 ①元の位置からフォルダを再帰移動。
 ②移動したフォルダ内のファイルの検索。
 ②検索条件は属性が"ビデオ"と不明なファイル。[NEW]
 ③ファイルの指定プロパティを取出す。
 ④ビデオ形式で縦横フレームが設定しているファイルは条件従い分類する。[NEW]
 ⑤処理ごとに集計して最後に出力。[NEW]
 ⑥不明なファイル(FLVなど)の処理手順は今後検討。

実行例:
 Cscript Info_MovieItem008.vbs {パス名}

 Cscript Info_MovieItem008.vbs C:\DOGA\!\新しいフォルダー > 
 Cscript Info_MovieItem008.vbs C:\DOGA\!\新しいフォルダー > 008.txt


'以下、末尾までスクリプト
'################################################
'
'実行例:Cscript Info_MovieItem008.vbs ディレクトリ名
'
'
'処理概要
' 指定フォルダからアイテムを再帰的に検索して、"ビデオ"と不明ファイルの指定プロパティを出力する。
'

'################################################
Option Explicit

'WScript.Object
Dim oWSFso , oWArgu , oWShellA

Dim sPATH_ITEM0
'Dim sPATH_ITEM1


'処理カウント
Dim iFOLDER_COUNT
Dim iFILE_COUNT
Dim iCONV_COUNTALL '処理実行カウント
Dim iCONV_COUNT26free
Dim iCONV_COUNT29free
Dim iCONV_COUNT32q
Dim iCONV_COUNT32w
Dim iCONV_COUNTNOT '未処理ファイル数カウント

'フォルダ・ファイル操作
Set oWSFso = WScript.CreateObject("Scripting.FileSystemObject")

'ファイル属性確認
'再帰的に呼び出すので、宣言をメインループより出した
Set oWShellA = WScript.CreateObject("Shell.Application")

'カウントリセット
iFOLDER_COUNT = 0 'フォルダカウント
iFILE_COUNT = 0 'ファイルカウント
iCONV_COUNTALL = 0 '処理実行カウント
iCONV_COUNT26free = 0
iCONV_COUNT29free = 0
iCONV_COUNT32q = 0
iCONV_COUNT32w = 0
iCONV_COUNTNOT = 0 '未処理ファイル数カウント



'パラメータ確認用
Set oWArgu = WScript.Arguments

Select case oWArgu.count
Case 1 'ファイルの属性確認

'置換用に元パス名保持
sPATH_ITEM0 = oWArgu.item(0)
' sPATH_ITEM1 = ""

'元パスの確認
If oWSFso.FolderExists( sPATH_ITEM0 ) = True  Then
'メインループ実行
   CALL INFO_MovieFolder( sPATH_ITEM0)

'処理終了 処理別カウント
WScript.Echo ""
WScript.Echo "################################"
WScript.Echo "##  ファイル属性確認カウント  ##"
WScript.Echo vbTab & "検索フォルダ数:" & iFOLDER_COUNT
WScript.Echo vbTab & "処理ファイル数:" & iFILE_COUNT
WScript.Echo vbTab & "対象ファイル数:" & iCONV_COUNTALL
WScript.Echo vbTab & " 変換種別SD26f:" & iCONV_COUNT26free
WScript.Echo vbTab & " 変換種別SD29f:" & iCONV_COUNT29free
WScript.Echo vbTab & " 変換種別HD32q:" & iCONV_COUNT32q
WScript.Echo vbTab & " 変換種別HD32w:" & iCONV_COUNT32w
WScript.Echo vbTab & "不明ファイル数:" & iCONV_COUNTNOT
WScript.Echo "################################"

Else
   Wscript.Echo "引数が不正です。" & vbTab & sPATH_ITEM0

End if

Case Else
    Wscript.Echo "引数が不正です。実行例:Cscript Info_MovieItem008.vbs 元パス"

End Select

'終了処理
Set oWArgu = Nothing
Set oWSFso = Nothing
Set oWShellA = Nothing
Wscript.Quit 


'################################################
' Case 1 '元パスファイルの属性確認
'################################################
'Sub INFO_MovieFolder(psPATH)
'
'処理概要
' 指定フォルダから再帰的にフォルダを検索する。
'
'IN
' psPATH 検索元パス
'
Sub INFO_MovieFolder(psPATH)
Dim cSFolder,oSFolder,oTemp,cFiler
Dim sMovie

Set cSFolder = oWSFso.GetFolder(psPATH)
Set oSFolder = cSFolder.SubFolders

'エラーでも実行
on error resume next
For Each oTemp In oSFolder
err.clear

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
iFILE_COUNT = iINFO_MovieFile(  psPATH ) + iFILE_COUNT 

end if
'以後、サブフォルダフォルダ
iFOLDER_COUNT=iFOLDER_COUNT+1
Wscript.Echo iFOLDER_COUNT & ")" & psPATH & "\" & oTemp.Name
'処理ファイル数カウントアップ
iFILE_COUNT = iINFO_MovieFile( psPATH & "\" & oTemp.Name ) + iFILE_COUNT 

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

Next

'サブフォルダー検索のみに使用
Set cFiler = cSFolder.Files
For Each oTemp In cFiler
err.clear
'処理なし
Next

'エラークリア
on error goto 0

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


'################################################
'Function iINFO_MovieFile( psFolder )
'
'処理概要
' 指定分類"ビデオ"ファイルの指定プロパティをEchoする
'
'IN
' psFolder 抽出するフォルダパス名
'
'OUT
' Return 参照ファイル数 "ビデオ" or "" 
'
Function iINFO_MovieFile( psFolder )
Const cBunrui_Video = "ビデオ"
Const cBunrui_Unknown = ""
Const cBunrui_Fumei = "[不明]"
Const PARA_COUNT = 512
    Dim rHeaders(512)

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

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

Dim sBunrui '分類
Dim iWidth '動画フレーム高
Dim iHeight '動画フレーム幅

'Echo文字列
Dim sWRITE_LINE

    Dim iFileCount'処理件数カウント

'指定フォルダのNamespace取得
    Set oNsFolder = oWShellA.Namespace(psFolder)
With oNsFolder

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

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

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

Select Case .GetDetailsOf(.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

sWRITE_LINE = "No." & vbTab
sWRITE_LINE = sWRITE_LINE & rHeaders(idxN)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rHeaders(idxB)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rHeaders(idxS)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rHeaders(idxL)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rHeaders(idxH)  & vbTab 
sWRITE_LINE = sWRITE_LINE & rHeaders(idxW)  
Wscript.Echo sWRITE_LINE

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

'分類を取得
sBunrui = .GetDetailsOf(oItem, idxB) 

'ビデオと不明のみ通す(フォルダやショートカットは除外)
If (sBunrui= cBunrui_Video) or (sBunrui= cBunrui_Unknown) Then

'処理件数カウント↑
iFileCount = iFileCount + 1
sWRITE_LINE = iFileCount  & vbTab 

'高さ、幅 を取得
iHeight = .GetDetailsOf(oItem, idxH)
iWidth = .GetDetailsOf(oItem, idxW)

'処理対象ファイル
If (sBunrui= cBunrui_Video) and (IsNumeric(iWidth)) and (IsNumeric(iHeight)) Then
'処理実行カウント
iCONV_COUNTALL = iCONV_COUNTALL + 1

iHeight = CLng(iHeight)
iWidth = CLng(iWidth)

If iHeight < 720 Then
iCONV_COUNT26free = iCONV_COUNT26free + 1
'sWRITE_LINE =  "SD26f"
ElseIf iHeight = 720 Then
iCONV_COUNT29free = iCONV_COUNT29free + 1
'sWRITE_LINE =  "SD29f"

ElseIf iHeight > 720 Then
If (iHeight / iWidth) > 0.6 Then
'4:3
iCONV_COUNT32q = iCONV_COUNT32q + 1
'sWRITE_LINE = "HD32q"

Else
'16:9
iCONV_COUNT32w = iCONV_COUNT32w + 1
'sWRITE_LINE =  "HD32w

End if

End if

Else
'処理除外ファイル
'分類 Bunrui_Fumei セット
sBunrui = cBunrui_Fumei
iCONV_COUNTNOT = iCONV_COUNTNOT + 1
End if

sWRITE_LINE = sWRITE_LINE & .GetDetailsOf(oItem, idxN) & vbTab 
sWRITE_LINE = sWRITE_LINE & sBunrui & vbTab 
sWRITE_LINE = sWRITE_LINE & .GetDetailsOf(oItem, idxS) & vbTab
sWRITE_LINE = sWRITE_LINE & .GetDetailsOf(oItem, idxL) & vbTab
sWRITE_LINE = sWRITE_LINE & iHeight & vbTab
sWRITE_LINE = sWRITE_LINE & iWidth
Wscript.Echo sWRITE_LINE
End if
   Next

Wscript.Echo ""
End if

End with

iINFO_MovieFile = iFileCount
    Set oNsFolder = Nothing
    Set oItem = Nothing
End Function

0 件のコメント:

コメントを投稿