rgl, Вот это спасибо! Вот это
КПД Спасибо за разъяснения, спасибо за помощь. Отдельное спасибо за замечания и абсолютно новые вещи, которых я раньше не знал.
Сообщение от rgl
|
Вместо того, чтобы пытаться с помощью форума исправить найденный непонятногде говнокод, лучше было бы это время и усилия потратить на то, чтобы разобраться в теме и написать нормально самому.
|
Так я и разбирался! Ну не мог я нигде найти практического применения в таком духе... В отдельных отрывках ничего не понятно и разобраться тяжело.
Зато получил наконец скрипт - ради чего и рекурсия нужна была, постарался конечно привести его в тот порядок сейчас вот как ты расписывал. Так вот Он выполняет обработку ярлыков в каждой папке и заменяет их пути на относительные. Мне это понадобилось т.к. у меня есть диски на которых есть система из сотен ярлыков, но они становятся не рабочими как только меняешь расположение диска, например подключаешь к другому компьютеру. Так вот теперь мои ярлыки будут заменены очень быстро, а работать будут на любом компьютере с системой 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) Считаем кол-во обработанных ярлыков.
}
}
}
}