Вместо того, чтобы пытаться с помощью форума исправить найденный непонятногде говнокод, лучше было бы это время и усилия потратить на то, чтобы разобраться в теме и написать нормально самому.
Мои замечания к приведенному коду:
1. Непонятно зачем тут вложенные циклы, снаружи while а внутри for. Достаточно одного.
2. Непонятно зачем многократно преобразовывать текстовую строку в объект типа фолдер и обратно. Лучше рекурсивной функции передавать сам объект а не строку, а преобразовывать в строку только для сообщения на консоль.
3. Чтобы найти текущую дирректорию (начальную) не нужны манипуляции с полным именем скрипта, для этого есть специальное свойство.
4. Хотя этот кусок и закомментарен сейчас, к регулярному выражению лучше добавить буковку i, я уже писал об этом.
5. Не надо использовать имя переменной root для обозначения каждой дирректории, сколь угодно глубоко вложенной. Затрудняет чтение (и понимание) кода.
6. Также затрудняет чтение и вносит путаницу имя переменной path, когда есть и используется одноименное свойство
С учетом всего этого получается:
var wsh = WScript.CreateObject("WScript.Shell");
//if( ! /cscript\.exe$/i.test( WScript.FullName ) ) { // проверить что запущено в консольном режиме
// wsh.Run("cmd /c cscript " + WScript.ScriptName ); // если нет, перезапустить в консоли
// WScript.Quit(0); // и завершить текущую инкарнацию (пусть работает перезапущенный в консоли)
//}
var fso = WScript.CreateObject("Scripting.FileSystemObject");
//var curdir = wsh.CurrentDirectory; // получаем текущую дирректорию (строку)
//var root = fso.GetFolder(curdir); // текущая дирректория (объект типа фолдер)
//sFolders(root); // вызываем рекурсивную функцию первый раз
sFolders(fso.GetFolder(wsh.CurrentDirectory));
function sFolders(dir) {
for( var seq = new Enumerator(dir.SubFolders); !seq.atEnd(); seq.moveNext()) {
WScript.Echo( "ПАПКА НА ПРОВЕРКУ = " + seq.item().path );
sFolders( seq.item() )
}
}