Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: TCShellCd- переход cd по значению из любого ключа реестра 
Author Message
ApceH



PostPosted: Wed Apr 20, 2011 19:05    Post subject: Reply with quote

Total7zip
Я так понял, что прога сработает только если родитель — totalcmd? И только на него влияет?

Известно, что в XP нет "официальной" папки Загрузки... Но оставлять не на всех ОС работающую кнопку на панели не хорошо! Тем более что у многих пользователей XP имеется такая папка, куда они обычно загружают всё с инета... Итак, что я задумал...
Приведу свой обновлённый скрипт для захода в папку из реестра:
Code:
/********************************************************************/
// Имя: GoToPathFromRegistry.js
// Автор: Шаповалов Арсений aka ApceH Hypocrite
// Описание: Переход TC в папку, путь которой получается из рестра по указанному ключу.
//           Если ключ отсутствует (например, в устаревшей ОС), предлагается выбрать папку.
//           Скрипт внесёт недостающий ключ.
/********************************************************************/

//Создаем объект ws
ws=WScript.CreateObject("WScript.Shell");

args=WScript.Arguments;
if (args.Count() < 2) {
 ws.Popup("Скрипт предназначен для запуска с панели Total Commander!\n\nСкрипт ожидает 2 или 3 параметра:\n• название ключа реестра с полным путём,\n• название значения реестра\n• локализованное название папки\n\nВнимание!\n• Нужно заключать в кавычки параметры, содержащие пробелы.\n• Слеши в пути НЕ нужно дублировать (экранировать).\n• В конце пути слеша быть НЕ должно.",0,"Неправильное использование",16);
 WScript.Quit(1);
}
KeyPath=args(0);
ValueName=args(1);
FolderName=(args.Length>=3)?" \""+args(2)+"\"":", которая должна была открыться";

//Читаем значение из реестра
try{
 Value=ws.RegRead(KeyPath+"\\"+ValueName);
}
catch(e){
 //ключ не найден
 ShellApp=WScript.CreateObject("Shell.Application");
 FolderDlg=ShellApp.BrowseForFolder(0, "Требуемый ключ реестра не найден!\nУкажите папку"+FolderName+",\nчтобы добавить недостающий ключ.", 0x11);
 //
 if (FolderDlg) {
  Value=FolderDlg.Items().Item().Path;
  ws.RegWrite(KeyPath+"\\"+ValueName, Value);
 }
 else WScript.Quit(2);
}
//==============
//вместо этого костыля хотелось бы запустить TCShellCD.exe...
//но его родителем будет wscript, поэтому он не сработает(((
//Создаём объект буфера обмена
try{
 clip=new ActiveXObject("ClipboardHelper.Clipboard");
}
catch(e){
 ws.Popup("Необходимая библиотека ClipboardHelper.dll не зарегистрирована!\nДля регистрации выполните от имен Администратора скрипт SystemRegister.cmd,\n находящийся в папке !Staging в месте, куда установлен kIT PPP.",0,"Неправильное использование",16)
 WScript.Quit(3);
}
try{
 //Получаем текущее содержимое буфера
 temp=clip.GetClipboardText();
 //Заносим в буфер обмена команду
 clip.SetClipboardText("cd "+Value);
 //"Вводим" в TC
 ws.SendKeys("{RIGHT}");
 ws.SendKeys("^a");
 ws.SendKeys("^v");
 WScript.Sleep(100);
 ws.SendKeys("{ENTER}");
 //Надо подождать, потому что может вставить возвращенный старый текст!
 WScript.Sleep(1000);
 //Возвращаем текст как было
 clip.SetClipboardText(temp);
}
catch(e) {}
/************* Конец ************************************************/

Кнопка примерно такая:
Code:
TOTALCMD#BAR#DATA
wscript %COMMANDER_PATH%\ADDONS\GoToPathFromRegistry.js
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" {374DE290-123F-4565-9164-39C4925E467B}
ICONS\downloads.ico
Перейти в папку "Загрузки"
%COMMANDER_PATH%\ADDONS\
1
-1

То есть я хочу, чтобы если человек нажал кнопку под устаревшей ОС, его попросили самому выбрать папку, которую он использует для "загрузок"...
Указанная папка прописывается в реестр и далее человек как-будто сидит под современной ОС!

Всё бы хорошо, но вместо шаманства с буфером обмена и посылкой нажатий клавиш, я не смог использовать вашу прогу TCShellCD, потому что её родителем становится wscript (или даже просто система, если он успевает завершится)... Я не смог найти, как сменить родителя процесса в WSH, да и это будет не менее идиотский костыль...

Таким образом, очень надеюсь, что вы реализуете в самой проге такой функционал:
если такого ключа нет (но синтаксически всё в порядке),
запросить указать папку
и записать её путь в переданный ключ реестра,
а затем перейти в эту папку, обычным способом (а в дальнейшем ключ уже будет существовать).
Ну конечно, если нажал Отмена, то ключ не создаём и в папку не входим.
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group