Вместо того, чтобы пытаться с помощью форума исправить найденный непонятногде говнокод, лучше было бы это время и усилия потратить на то, чтобы разобраться в теме и написать нормально самому.
Мои замечания к приведенному коду: 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() ) } } |
rgl, Вот это спасибо! Вот это КПД :victory: Спасибо за разъяснения, спасибо за помощь. Отдельное спасибо за замечания и абсолютно новые вещи, которых я раньше не знал.
Цитата:
Зато получил наконец скрипт - ради чего и рекурсия нужна была, постарался конечно привести его в тот порядок сейчас вот как ты расписывал. Так вот Он выполняет обработку ярлыков в каждой папке и заменяет их пути на относительные. Мне это понадобилось т.к. у меня есть диски на которых есть система из сотен ярлыков, но они становятся не рабочими как только меняешь расположение диска, например подключаешь к другому компьютеру. Так вот теперь мои ярлыки будут заменены очень быстро, а работать будут на любом компьютере с системой Windows конечно. Вот весь код: var wsh = WScript.CreateObject("WScript.Shell"); if( ! /cscript\.exe$/i.test( WScript.FullName ) ) { // проверить что запущено в консольном режиме wsh.Run("cmd /c cscript " + WScript.ScriptName ); // если нет, перезапустить в консоли WScript.Quit(0); // и завершить текущую инкарнацию (пусть работает перезапущенный в консоли) } var kollnk = 0; var fso = WScript.CreateObject("Scripting.FileSystemObject"); // lnk( fso.GetFolder(wsh.CurrentDirectory) ) // запускаем изменение ярлыков для текущей папки т.к. она не обрабатывалась sFolders(fso.GetFolder(wsh.CurrentDirectory)); // запускаем рекурсию для текущей дирректории WScript.Echo("Все готово! Количество обработанных ярлыков = " + kollnk); WScript.Sleep(999000); function sFolders(dirfld) { for( var seq = new Enumerator(dirfld.SubFolders); !seq.atEnd(); seq.moveNext()) { //WScript.Echo( seq.item().path ); lnk( seq.item() ); sFolders( seq.item() ); } } function lnk(dirlnk) // Функция замены свойств ярлыка для относительного пути. { WScript.Echo(dirlnk); // Вывод Папки которая обрабатывается в данный момент var count2 = ( dirlnk.path.split('\\').length - 1 ); //27 считаем количество вхождений косой черты в адресе текущей папки var strNew = ""; // формируем переменную для подстановки и запускаем цикл while ( count2 > 0 ) {strNew = strNew + "..\\"; count2 = count2 - 1;} // сформирует относительный путь for ( var colFiles = new Enumerator (dirlnk.Files); !colFiles.atEnd(); colFiles.moveNext()) // Цикл по всем файлам в { if (colFiles.item().Name.length-colFiles.item().Name.lastIndexOf(".lnk")-4==0) // Если проверяемый файл - ярлык { // тогда var wshShell = WScript.CreateObject("WScript.Shell"); // Создаем новый объект ВСШ для доступа к файлу var oShellLink = wshShell.CreateShortcut(dirlnk.path + "\\" + colFiles.item().Name); // Открываем свойства ярлыка if (oShellLink.TargetPath.split('explorer.exe').length!=2) // Если текущий ярлык еще не был переделан... { // тогда переделываем его: var strPath = oShellLink.TargetPath.substring(3);// 1) Сохраняем изначальный путь без Диска двоиточия и косой черты oShellLink.TargetPath = '%windir%\\explorer.exe'; // 2) заменяем старое имя на имя файла проводника Windows. oShellLink.Arguments = '"' + strNew + strPath + '"' // 3) Вместо старого Записываем новый адрес oShellLink.WorkingDirectory = ""; // 4) В свойствах ярлыка Рабочая папка должна быть пустой oShellLink.Save(); // 5) Сохраняем ярлык с измененными свойствами. kollnk = kollnk + 1;// 6) Считаем кол-во обработанных ярлыков. } } } } |
........................... function sFolders(dirfld) { lnk(dirfld); for( var seq = new Enumerator(dirfld.SubFolders); !seq.atEnd(); seq.moveNext()) { //WScript.Echo( seq.item().path ); sFolders( seq.item() ); } } |
Часовой пояс GMT +3, время: 18:44. |