Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #61 (permalink)  
Старый 19.03.2013, 15:10
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Вместо того, чтобы пытаться с помощью форума исправить найденный непонятногде говнокод, лучше было бы это время и усилия потратить на то, чтобы разобраться в теме и написать нормально самому.
Мои замечания к приведенному коду:
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, 19.03.2013 в 15:12.
Ответить с цитированием
  #62 (permalink)  
Старый 22.03.2013, 19:30
Интересующийся
Отправить личное сообщение для kosmonavtom Посмотреть профиль Найти все сообщения от kosmonavtom
 
Регистрация: 07.03.2013
Сообщений: 27

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) Считаем кол-во обработанных ярлыков.
				} 
      		} 
   	}
}

Последний раз редактировалось kosmonavtom, 22.03.2013 в 19:34.
Ответить с цитированием
  #63 (permalink)  
Старый 23.03.2013, 20:04
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

lnk( fso.GetFolder(wsh.CurrentDirectory) ) // запускаем изменение ярлыков для текущей папки т.к. она не обрабатывалась
...........................
function sFolders(dirfld) {
lnk(dirfld);
for( var seq = new Enumerator(dirfld.SubFolders); !seq.atEnd(); seq.moveNext()) {
//WScript.Echo( seq.item().path );
lnk( seq.item() );
sFolders( seq.item() );
}
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод значения функции через равный интервал cOAPerator Общие вопросы Javascript 43 31.12.2012 03:54
Скрипты отправка сообщений между пользователями, скрипт вывод текста на страницу.... Rapala Элементы интерфейса 2 12.01.2011 17:27
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Динамический вывод текстовых сообщений Артём Тарасов Общие вопросы Javascript 4 19.02.2009 13:36