2014年1月11日土曜日

VBScriptによるアイテム情報の取得(汎用版)

 仕事始めから数日たち、ようやく落ち着いて来たので過去の行状を振り返ってみました、、、、削除したい気分になりましたorz 動画の自動圧縮としてブログを書き始めたのに、それはオマケな気が、、、、どうしてこうなった?
 まぁ、イイヤ。急がば回れと言うし。ともかく、何度かは「指定フォルダ内のアイテム詳細情報の取り出し」をテーマに、動画ファイルの情報を取り出したいがために試行錯誤した。 あの時にイロイロ思いついた事を形にして汎用版作って見てもいいかもと思い立ち、リハビリ代わりに組んでみました。
 
 出来るだけお気楽に使用できるよう、ドラッグ&ドロップを基本としています。
 もちろん、ちょとコマンド実行できたら便利かな~な使い方も出来るようにしてみました。
 再帰検索はしていません。指定したアイテムのみの検索としています。


 ※アイテムがショートカットだと詳細情報の表示はできません。 アイテム-フォルダの中にあるショートカットだと詳細情報の表示は出来ます。



実行環境:
 作成テストはWindows8.1でしています。Windows7sp1での実行は問題ありませんでした。

実行例:

・VBScriptファイルに直接またはショートカットに、詳細表示したいファイルをドラッグ&ドロップした場合。
アイテムの詳細情報が全部出る。 未設定の項目は表示しない。


・VBScriptファイルに直接またはショートカットに、詳細表示したいフォルダをドラッグ&ドロップした場合。
1.【詳細表示アイテム絞込条件の入力】 そのまま「OK」で全対象
2.【表示位置の指定】 表示対象アイテム数が10以上あった場合、10単位で連続出力するので、表示したい位置の番号を入力指定する。(ex. 11以上表示したかったら 1 ) 範囲外または文字を入力した場合は中止となります。
3.【アイテム詳細情報】 入力値の範囲分を順次出力する。
これにて終了。


・コマンドライン
Cscript ShowItemDetails1.vbs パス名 [連続表示数] [出力項目数] 
 コマンドラインでの実行では、アイテム名のみ渡せば実行と同様の動きをしますが、 第2引数 [連続表示数]第3[出力項目数] を渡すことで、出力の整形が出来ます。


・第1引数 アイテム名 のみ
   Cscript ShowItemDetails1.vbs c:
 詳細表示アイテム絞込条件の入力】 【表示位置の指定】 以外はコマンドライン出力



第1引数 アイテム名、第2引数 [連続表示数]

   Cscript ShowItemDetails1.vbs c: 20 
 通常は最大10と固定となっているアイテム連続出力数の設定。ただしあまり数を多くすると実行後に反応が無く不安になるので注意。 詳細表示アイテム絞込条件の入力】で絞り込まれた数が[連続表示数]を超えると別扱いとなる。ドラッグ実行で設定できないのは、うかつに数多くすると詳細表示の際にひたすらOKボタンを押す羽目になるから、、、だったりする。 
 時間がかかっても指定数を一気に出力するので、表出力の際とか便利かもしれない。




第1引数 アイテム名、第2引数 [連続表示数]、第3[出力項目数]
   Cscript ShowItemDetails1.vbs c: 20 5
 [出力項目数]を設定する事で、列[出力項目数]×行[連続表示数]の表出力となる。指定は1~512(不正値は1)。 値が未設定でも出力。
 通常のアイテム詳細表示では、値が有るデータのみ出力としている。 これはアイテムの毎に設定場所が違うからというのがあるが、値の比較をしたい場合とかは不便といえる。

 表出力では項目を基準としているため、値の有無にかかわらず出力する。 タブ区切りなのでリダイレクトでファイル出力してやれば、表計算ソフトなどで利用しやすいかもしれない。

   Cscript ShowItemDetails1.vbs c: 20 5 > c20-5.txt


'処理について
 今回は、コマンドライン以外での使用も考慮したためWscript.Echoの使いどころに注意してみました。 詳細表示出力の他に、検索条件や表示指定などの入力値ももあったため、それらの情報もまとめとして出力するようにしています。
 アイテムの詳細表示ネタはここまでで、以後はメインテーマの動画の自動圧縮に戻ります。まずは差分判定にするか。。。。。


'以下、末尾までスクリプトです。 ではまた~ノシ
'################################################
'
'実行例:Cscript ShowItemDetails1.vbs パス名 [連続表示数] [出力項目数] 
'
'処理概要
' 指定フォルダ内のアイテム情報を抜き出し Echo する。
' ファイルの場合は、ドロップしたアイテムのみ情報を出す。
'
'1.パス名 
' アイテム名をフルパス指定する。ドラッグ&ドロップが楽。
'
'3.[連続表示数] 
' 一度に連続表示するデータを設定。表示数が多くなると出力に時間がかかる。
' 既定値10。
'
'3.[表示項目数] 一覧出力のみ
' 値を設定すると、出力形式が表になる。
' 最少1 最大512 既定334 値が""でも出力。表示数が多くなると出力に時間がかかる。
'
'################################################

Option Explicit

Dim oWSFso , oWArgu , oWSApp

Const cNULL = ""

'引数
Dim sParaItem0
Dim oParaItem0 
Dim sParaItem1
Dim sParaItem2

'ヘッダラベル
Dim iPARA_COUNT
Dim rPARA_LABEL(512)
Const cParaCount = 334 'ヘッダ数既定
Const cParaMin = 1'ヘッダ数下限
Const cParaMax = 512'ヘッダ上限

Dim bLIST '真でリスト表示 Echo

Dim iBLOCK_SIZE
Const cBlockSize = 10 '詳細表示が BlockSize 件以上ある場合、BlockSize毎に出力する
Dim iBlockUpp '表示ブロック番号 上限
Dim iBlockPos '表示ブロック番号
Dim bBlockPos

Dim iShowCount
Dim iAllCount
Dim sInputRes , sInputPromp , sInputTitle , sInputDefault
Dim sInputExt


Dim sEcho 'メッセージ保持

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

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

'ファイル属性確認
Set oWSApp = WScript.CreateObject("Shell.Application")

'***第3パラメータ設定
'属性 検索数 デフォルト
iPARA_COUNT = cParaCount

'真でリスト表示 Echo
bLIST = False

bLIST = oWArgu.count >= 3 
If bLIST Then
sParaItem2 = oWArgu.Item(2)

'違反値は先頭列のみ表示
If IsNumeric(sParaItem2)  Then

'範囲外は先頭列のみ表示
iPARA_COUNT = Clng(sParaItem2)
If iPARA_COUNT < cParaMin or cParaMax < iPARA_COUNT Then
iPARA_COUNT = cParaMin 

End if

Else
iPARA_COUNT = cParaMin 

End if
End if


'***第2パラメータ設定
'表示ブロックサイズ デフォルト
iBLOCK_SIZE = cBlockSize

If oWArgu.count >= 2 Then
sParaItem1 = oWArgu.Item(1)

'数値のみ
If IsNumeric(sParaItem1) Then
'符号なしで取得
iBLOCK_SIZE = Abs(Clng(sParaItem1))

End if

End if


'***第1パラメータ設定

'パラメータ数チェック
If oWArgu.count >= 1 Then

sParaItem0 = oWArgu.item(0)

iShowCount = 0

'引数のフォルダ存在チェック
If oWSFso.FileExists( sParaItem0 ) = True Then
'パラメータがフォルダ名 ⇒ 中のアイテム全 表示
Set oParaItem0 = oWSFso.GetFile(sParaItem0)

'対象件数取得 (指定アイテムだけ表示)
iAllCount = iSHOW_ItemDetails( Cstr(oParaItem0.ParentFolder) , Cstr(oParaItem0.Name) , 0 , 0)
iShowCount = iSHOW_ItemDetails( Cstr(oParaItem0.ParentFolder) , Cstr(oParaItem0.Name) , 1 , iAllCount)

sEcho = sParaItem0 & vbCrlf & vbCrlf 
'そのまま詳細表示
If iShowCount > 0 Then
sEcho = sEcho & "1件の詳細表示は終了しました。"

Else
'※ここでのこの状態はあまり考えられない
sEcho = sEcho & "指定アイテムなし。"

End if


Elseif oWSFso.FolderExists( sParaItem0 ) = True Then
'アイテム絞込条件入力
sInputPromp = "パス名 :" & sParaItem0 & vbCrlf & vbCrlf
sInputPromp = sInputPromp & vbCrlf
sInputPromp = sInputPromp & " そのまま「OK」で、指定フォルダ内のアイテムを表示します。" & vbCrlf 
sInputPromp = sInputPromp & " 値を入力するとアイテム名(拡張子含む)で絞込表示します。" & vbCrlf 
sInputPromp = sInputPromp & vbCrlf
sInputPromp = sInputPromp & "「キャンセル」で処理を中止します。"
sInputTitle = "詳細表示アイテム絞込条件の入力"
sInputDefault = " "
sInputRes = InputBox( sInputPromp , sInputTitle , sInputDefault )

'0文字 だとキャンセル
If Len(sInputRes) > 0 Then
sInputExt = Trim(sInputRes)
'対象件数取得
iAllCount = iSHOW_ItemDetails(sParaItem0 , sInputExt , 0, 0)

iBlockUpp = ( ( iAllCount - 1 ) \ iBLOCK_SIZE )
'↓↓↓結果出力で使用
sEcho  = "パス名 :" & sParaItem0 & vbCrlf & vbCrlf
sEcho = sEcho & " 絞込条件: " & sInputExt & vbCrlf
sEcho = sEcho & " 該当件数が " &  iAllCount & " あります。" & vbCrlf 
sEcho = sEcho & " 連続表示数 " & iBLOCK_SIZE & " で出力します。"  & vbCrlf 

iBlockPos = 0 '表示 初期位置
bBlockPos = True

'該当件数が 連続表示数を超えている ⇒ 表示位置の選択
If iAllCount > iBLOCK_SIZE Then
'範囲出力用
sEcho = sEcho & " 表示範囲( 0 - " & iBlockUpp  &  " )"
'↑↑↑結果出力で使用
sInputPromp = sEcho & "を指定してください。" 
sInputPromp = sInputPromp & vbCrlf
sInputPromp = sInputPromp & vbCrlf
sInputPromp = sInputPromp & "「キャンセル」で処理を中止します。"
sInputTitle = "表示位置の指定"
sInputDefault = 0 '先頭位置指定
sInputRes = InputBox(sInputPromp , sInputTitle , sInputDefault )
sInputRes = Trim(sInputRes)

bBlockPos = Len(sInputRes) > 0'入力文字確認
'0文字 だとキャンセル
If bBlockPos Then
'数値チェック
bBlockPos = IsNumeric(sInputRes)
If bBlockPos Then
'範囲チェック
iBlockPos = Clng(sInputRes)
bBlockPos = ( 0 <= iBlockPos and iBlockPos <= iBlockUpp )
End if
'数値・範囲 から外れている文字を指定外とする
If Not bBlockPos  Then
sEcho = sEcho & vbCrlf
sEcho = sEcho & vbCrlf
sEcho = sEcho & " 表示指定:" & sInputRes & vbCrlf & vbCrlf & "入力値が指定外です。 詳細表示を中止します。" 
End if

Else
sEcho = sEcho & vbCrlf
sEcho = sEcho & vbCrlf
sEcho = sEcho &  "【表示位置】" & vbCrlf & "詳細表示を「キャンセル」しました。" 

End If

End if

If bBlockPos Then
'表示位置指定が範囲内
iShowCount = iSHOW_ItemDetails(sParaItem0 , sInputExt , ( iBlockPos + 1 ) , iAllCount)

sEcho = sEcho & vbCrlf
sEcho = sEcho & vbCrlf
sEcho = sEcho & " 表示位置:" & (iBlockPos * iBLOCK_SIZE + 1) & "から" & iShowCount & "件" & vbCrlf

'ブロックサイズ設定があれば表示
If Len(sParaItem1)>0 Then
sEcho = sEcho & vbCrlf
sEcho = sEcho & " 連続表示数:" & iBLOCK_SIZE & " (連続表示数:" & sParaItem1  & ")" 
End if

If bLIST then
sEcho = sEcho & vbCrlf
sEcho = sEcho & " 表示列数:" & iPARA_COUNT 
'列数設定があれば表示
If Len(sParaItem2)>0 Then
sEcho = sEcho & " (表示項目数:" & sParaItem2  & ")" 
End if

End if

sEcho = sEcho & vbCrlf
If iShowCount > 0 Then
sEcho = sEcho & "詳細表示は終了しました。"

Else
sEcho = sEcho & "該当アイテムなし。終了します。" 

End if

End if

Else
'処理結果判定 中止
sEcho = sParaItem0  & vbCrlf & "【絞込設定】" & vbCrlf & "詳細表示を「キャンセル」しました。" 

End If

Else
sEcho =  sParaItem0  & vbCrlf &  "指定アイテムはありません。 詳細表示を中止します。" 

End if

Else
sEcho = "引数が不正です。実行例:Cscript ShowItemDetails1.vbs パス名"

End If

Wscript.Echo sEcho


'終了
Set oWSFso = Nothing
Set oWArgu = Nothing
Set oWSApp = Nothing
Wscript.Quit



'################################################
'Function iSHOW_ItemDetails(psFolder , ps1Item , piBlock , iItemAll)
'処理概要
'同一フォルダ内のアイテムを絞込条件(ファイル名拡張子含むから後方一致)に従い、カウントまたはEchoする。
'
'IN
' psFolder
'  情報取得する存在するフォルダ名
' 
' ps1Item
'  {ファイル名完全一致・条件なし・条件あり}
' 
' piBlock 
'  ( piBlock = 0 )該当件数取得
'  ( piBlock > 0 )表示ブロック指定
' 
' iItemAll
'  予め取得しておいた全件カウント。詳細情報表示の際に使用
'
'OUT
' 1.ps1Itemに従い 条件該当件数を取得
' 2.ps1Itemに従い piBlock 位置の詳細情報を表示
'
'補足
' 内部計算はカウント基準(0<Count)
'
Function iSHOW_ItemDetails(psFolder , ps1Item , piBlock , iItemAll)
Dim iItemCount '処理アイテムカウント(表示が0ならこちら出力)
Dim iShowCount '表示アイテムカウント

Dim oNsFolder
Dim oItem

Dim bItem'アイテム取得フラグ
Dim bShow'アイテム表示フラグ

Dim iPara
Dim s1Echo

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

if 0 < piBlock Then

s1Echo=cNULL

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

If bLIST then
'一覧出力
s1Echo = s1Echo & vbTab & rPARA_LABEL(iPara)
End if
Next

If bLIST then
'一覧出力
Wscript.Echo s1Echo
End if

End if

'処理カウント初期化
iItemCount = 0
'表示カウント初期化
iShowCount = 0


For Each oItem in oNsFolder.Items

'値がoItemと一致なら表示。 ps1Itemが空白か、

'ファイル名完全一致
bItem = ( oItem.Name = ps1Item ) 

'ファイル絞込条件なし
If Not bItem Then
bItem = ( ps1Item = cNULL )
End if

'ファイル名 拡張子 後方一致条件アリ
If Not bItem Then
bItem =  Right( oItem.Name , Len( ps1Item ) ) = ps1Item 
End if

'絞込条件許可のみ
If bItem Then
iItemCount = iItemCount + 1

If piBlock  > 0 Then
bShow = ( ((piBlock-1)*iBLOCK_SIZE+1) <= iItemCount ) and ( iItemCount <= (piBlock * iBLOCK_SIZE) )

Else '=0
'Countだけなので出力はしない
bShow = False

End If

'指定件数から出力
If bShow Then

iShowCount = iShowCount + 1

'パスの出力
s1Echo =  iItemCount  & "/" & iItemAll  
If bLIST then
'一覧出力
Else
'パスの出力
s1Echo = s1Echo & vbTab & oItem.Path
End if

'詳細情報の取得 iPARA_COUNT まで検索して保管情報を抜き出す
For iPara = 0 to (iPARA_COUNT-1)

If bLIST then
'一覧出力
s1Echo = s1Echo & vbTab & oNsFolder.GetDetailsOf(oItem, iPara)
Else
'情報格納分のみラベルと詳細情報の表示
If oNsFolder.GetDetailsOf(oItem, iPara) <> cNULL Then

s1Echo = s1Echo & vbCrlf &  iPara & ")" & rPARA_LABEL(iPara) & ": " & vbTab & oNsFolder.GetDetailsOf(oItem, iPara)
End If
End if

Next
If piBlock>0 Then
If bLIST then
'一覧出力
Else
'詳細表示は次のアイテム間データに改行
s1Echo = s1Echo & vbCrlf
End if

'出力
Wscript.Echo s1Echo
End if
End if
End if
Next

'結果出力

'処理アイテムカウント出力
iSHOW_ItemDetails = iItemCount

'詳細表示が行われていたら、表示アイテムカウント出力
If iShowCount > 0 Then iSHOW_ItemDetails = iShowCount
End Function

0 件のコメント:

コメントを投稿