2007年10月14日 日曜日 2:16:30

選択フォルダの階層構造をテキストファイルに出力するMDIE用スクリプト

MDIE,javascript,プログラム,日記 [ by Mizugame ]

20071014.jpg
引き続きMDIE用のスクリプトを作成してみました。

今度は選択中のフォルダの階層構造を取得して、テキストファイルに書き出すスクリプトです。
またまたありがちなスクリプトですが・・・。

というわけで、スクリプトを書いていたもののちょっと問題発生。
JavaScriptだとサブディレクトリを再帰的に辿っていくのは無理っぽい。

さらに、MDIEのVBスクリプトの動作がよくわからない(誰か教えて!)・・・というような問題がおきたので、しばらく悩んで発想を変えてた。

  1. JavaScriptで選択中のフォルダを取得
  2. 選択したフォルダをシェルを使用してVBスクリプトに受け渡す
  3. 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スクリプトの記述が初めてだったので見苦しいところがあるかもしれませんが・・・。
(もうちょっと綺麗にできそうなんだけど、しんどいので今回はこれで)

細かい説明は長くなりそうなので省きます(^^;
まぁ、なにかあればコメントとかで質問してください。

使い方を以下で説明します。

  1. tree.zip」をダウンロード
  2. ダウンロードしたファイルを解凍してMDIEのインストールフォルダにあるscriptフォルダ内に移動(任意のフォルダに入れてもいい)
  3. 「treeBatVbs.js」をエディタで開いて4行目の「ScriptName」と5行目の「ScriptDir」を「tree.vbs」のパスに合わせて書き換える
  4. MDIEを起動してメニューにあるツールから「拡張」→「スクリプトに追加」でダウンロードしたスクリプト(Javascriptの方)を登録
  5. MDIEのメニューのツールからキーボードショートカットやマウスジェスチャに登録

以上で選択中のフォルダの階層構造がテキストに出力されます。

動作の簡易説明ですが、フォルダを選択中にキーボードショートカット等でスクリプトを呼び出せば階層構造をガリガリ取得します。

その後、スクリプトが呼び出されたフォルダに「filetree.txt」というテキストファイルを作成します。(すでに同名のファイルが存在する場合はfiletree (2).txtのように番号が付与されていきます)

あと、メモリの消費とかまったく考えていませんので、サブディレクトリやファイルが大量に存在する場合は注意して下さい。

あと、前回同様このスクリプトを利用して発生した損害につきまして、一切責任は負いませんのでご了承ください。

以下、スクリプトを確認した環境です。

  • Windows XP sp2
  • Windows 2000 (VBスクリプト単体での動作チェックのみ)
  • MDIE Ver 0.3.0.0 RC5

関連情報:
拡張子ごとにフォルダ振り分けを行うMDIE用スクリプト
カスタマイズ性の高い高機能ファイラ「MDIE」

コメント (0) »