JavaScript(WSH)
特定フォルダ以下をトラバースしてファイル名を収拾
コンバータやちょっとしたファイルチェッカーを作ろうと思ったらフォルダ以下をトラバースする作業が大抵出てきます。結構頻繁に出てくるのでテンプレートになるJScriptコードを置いておきます:
FileNameCollect.js var wsh = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
// folderPath以下をトラバースしてファイル名をかき集める
function CheckFolder(filePathAry, folderPath, collectFunctor) {
var folderObj = fso.GetFolder(folderPath);
// ファイル名列挙
var files = new Enumerator(folderObj.Files);
for (; !files.atEnd(); files.moveNext()) {
var filePath = fso.GetAbsolutePathName(files.item());
if (collectFunctor(filePath) == true)
filePathAry.push(filePath);
}
// サブフォルダへ
var folders = new Enumerator(folderObj.SubFolders)
for (; !folders.atEnd(); folders.moveNext()) {
CheckFolder(filePathAry, folderPath + "\\" + folders.item().Name, collectFunctor);
}
}
// 取得フィルター
// 全部集める
function nullFunctor(filePath) {
return true;
}
// 特定拡張子のみ
function extFunctor(filePath) {
var extArray = ["txt", "exe"];
var ext = fso.GetExtensionName(filePath);
for (var i = 0; i < extArray.length; i++)
if (ext == extArray[i])
return true;
return false;
}
// カレントディレクトリ取得
var rootDir = wsh.CurrentDirectory;
var filePathAry = new Array;
CheckFolder(filePathAry, rootDir, extFunctor); // <- Fuctorでフィルター掛けられます
// 収集したファイルフルパスチェック
for (var i = 0; i < filePathAry.length; i++)
WScript.Echo(filePathAry[i]);
CheckFolder関数の第3引数にフィルタ関数を渡せば、特定の条件に見合うファイル名だけを収集できます。毎回このコードを思い出すのに時間がかかっていたので、これですっきりすっきり(^-^)。
使い方は収拾を始めたいフォルダに上のjsを入れて、起動させる.batを作ります:
FileNameCollect.bat cscript FileNameCollect.js
引数に検索するルートパス名を渡す実装もありですね。