2007年10月14日 日曜日 2:16:30
選択フォルダの階層構造をテキストファイルに出力するMDIE用スクリプト
今度は選択中のフォルダの階層構造を取得して、テキストファイルに書き出すスクリプトです。
またまたありがちなスクリプトですが・・・。
というわけで、スクリプトを書いていたもののちょっと問題発生。
JavaScriptだとサブディレクトリを再帰的に辿っていくのは無理っぽい。
さらに、MDIEのVBスクリプトの動作がよくわからない(誰か教えて!)・・・というような問題がおきたので、しばらく悩んで発想を変えてた。
- JavaScriptで選択中のフォルダを取得
- 選択したフォルダをシェルを使用してVBスクリプトに受け渡す
- VBスクリプトで階層構造を作成、ファイルに出力
とりあえず、こんな感じで処理をするように変更したので、階層構造を取得するためのスクリプトファイルが2つになってしまいました・・・。
まぁ、今後の参考になりそうなのでいいか。
で、ようやく完成したスクリプト。
まずはJavascriptから。
var Temp = new String();
var Shell = new ActiveXObject("WScript.Shell");
var count = FolderView.count;
var ScriptName = "tree.vbs";
var ScriptDir = "C:\mdie\script\"
for (i=0; i<count; i++) {
if (FolderView.Items(i).Selected) {
Temp += " \""+ FolderView.Items(i).Path + "\"";
}
}
//MDIE.echo(ScriptDir + ScriptName) // 一応デバッグ用に残しておく
Shell.Run(ScriptDir + ScriptName + Temp);
ほとんど解説する必要は無いと思うのですが、2点だけ。
4行目の「ScriptName」この後に紹介するVBスクリプトのファイル名を指定してください。
5行目の「ScriptDir」はVBスクリプトを保存したフォルダ名です。
フォルダの区切り文字は「\\」で記述してください。(JavaScriptだから)
次にVBスクリプト。
' DefiningCode
DefFileName = "filetree" ' ファイルツリーを保存するファイルネーム
DefFileExt = "txt" ' ファイルツリーを保存するファイルの拡張子
DefDirCaption = "\" ' ディレクトリの前に付ける目印
DefIndentSpace = "4" ' 1階層ごとに下げるインデントスペース
' UserObject
Class IndentClass
Public Indent
Private Sub Class_Initialize
Indent = ""
End Sub
Public Sub Down()
Indent = Indent & Space(DefIndentSpace)
End Sub
Public Sub Up()
Length = Len(Indent)
If (Length - DefIndentSpace) > 0 Then
Indent = Mid(Indent, 1, (length - DefIndentSpace))
Else
Indent = ""
End If
End Sub
End Class
Dim oInd
Set oInd = new IndentClass
' UserMethod
Function ReadDir(d, Temp)
Set oFolder = FSO.GetFolder(d)
For Each fileName In oFolder.Files
Temp = Temp & oInd.Indent & FSO.GetFileName(fileName) & vbNewLine
Next
For Each folderName In oFolder.SubFolders
Temp = Temp & oInd.Indent & DefDirCaption & folderName.Name & vbNewLine
oInd.Down()
Temp = ReadDir(folderName, Temp)
Next
oInd.Up()
ReadDir = Temp
End Function
' Program
Set Argu = WScript.Arguments
Set FSO = CreateObject("Scripting.FileSystemObject")
If Argu.count = 0 Then
WScript.Echo "参照フォルダが選択されていません" _
& vbNewLine _
& "処理を中断します"
WScript.Quit
End If
If Argu.count > 1 Then
oInd.Down()
For Each Index In Argu
If FSO.FolderExists(Index) = True Then
Set oFolder = FSO.GetFolder(Index)
Temp = Temp & oInd.Indent & DefDirCaption & oFolder.Name & vbNewLine
oInd.Down()
Temp = ReadDir(Index, Temp)
End If
Next
Else
If FSO.FolderExists(Argu(0)) = True Then
Set oFolder = FSO.GetFolder(Argu(0))
oInd.Down()
Temp = Temp & oInd.Indent & DefDirCaption & oFolder.Name & vbNewLine
oInd.Down()
Temp = ReadDir(Argu(0), Temp)
Else
WScript.Echo "フォルダが選択されていません" _
& vbNewLine _
& Argu(0)
End If
End If
' fileWrite
If Temp = "" Then
WScript.Echo "階層情報の取得に失敗しました" _
& vbNewLine _
& "処理を中断します"
WScript.Quit
Else
oInd.Up()
Temp = oInd.Indent & FSO.GetParentFolderName(Argu(0)) & vbNewLine & Temp
fPath = FSO.GetParentFolderName(Argu(0)) _
& "\" & DefFileName _
& "." & DefFileExt
If FSO.FileExists(fPath) = False Then
Set fStrm = FSO.CreateTextFile(fPath)
Else
i = 2
Do While FSO.FileExists(fPath) = True
fPath = FSO.GetParentFolderName(Argu(0)) _
& "\" & DefFileName & " (" & i & ")" _
& "." & DefFileExt
i = i + 1
Loop
Set fStrm = FSO.CreateTextFile(fPath)
End if
fStrm.Write(Temp)
' Result
WScript.Echo "ファイル構成を書き出しました。" _
& vbNewLine & vbNewLine _
& fPath
End If
' Free
Set Temp = Nothing
Set Argu = Nothing
Set FSO = Nothing
Set fPath = Nothing
Set fStrm = Nothing
Set oFolder = Nothing
Set oIndent = Nothing
VBスクリプトの記述が初めてだったので見苦しいところがあるかもしれませんが・・・。
(もうちょっと綺麗にできそうなんだけど、しんどいので今回はこれで)
細かい説明は長くなりそうなので省きます(^^;
まぁ、なにかあればコメントとかで質問してください。
使い方を以下で説明します。
- 「tree.zip」をダウンロード
- ダウンロードしたファイルを解凍してMDIEのインストールフォルダにあるscriptフォルダ内に移動(任意のフォルダに入れてもいい)
- 「treeBatVbs.js」をエディタで開いて4行目の「ScriptName」と5行目の「ScriptDir」を「tree.vbs」のパスに合わせて書き換える
- MDIEを起動してメニューにあるツールから「拡張」→「スクリプトに追加」でダウンロードしたスクリプト(Javascriptの方)を登録
- MDIEのメニューのツールからキーボードショートカットやマウスジェスチャに登録
以上で選択中のフォルダの階層構造がテキストに出力されます。
動作の簡易説明ですが、フォルダを選択中にキーボードショートカット等でスクリプトを呼び出せば階層構造をガリガリ取得します。
その後、スクリプトが呼び出されたフォルダに「filetree.txt」というテキストファイルを作成します。(すでに同名のファイルが存在する場合はfiletree (2).txtのように番号が付与されていきます)
あと、メモリの消費とかまったく考えていませんので、サブディレクトリやファイルが大量に存在する場合は注意して下さい。
あと、前回同様このスクリプトを利用して発生した損害につきまして、一切責任は負いませんのでご了承ください。
以下、スクリプトを確認した環境です。
- Windows XP sp2
- Windows 2000 (VBスクリプト単体での動作チェックのみ)
- MDIE Ver 0.3.0.0 RC5
トラックバック URL :
コメント (0)