Script Content Plugin

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher
??? Content и так неплохо передаётся, к тому же, я имею возможность сформировать его в любом виде. Проблема в filename, но её я не передаю, а получаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
Аналогично. Попробуй сразу получать пути через SC.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Вроде, работает:

Код: Выделить всё

Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
SC.AddCode("function FA(e){return(e);}")
content=SC.Run("FA",filename)
т.е. скрипт vbs, а в SC код js. Что там внутри - завтра смотреть буду. Наоборот - скрипт js, в SC код vbs - не работает, поскольку в SC значение js передать должен, а он не может...

Добавлено спустя 37 минут:

Ткните носом, где про ScriptControl почитать. На MSDN всё в контексте C++/C#, даже addCode не видел. Есть ли у него возможность подгрузить js код из внешнего файла? Что-нибудь вроде loadFromFile, src=, или подобное...
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Мда... С помощью FSO.OpenTextFile в принципе работает... Хотелось бы попроще.
И ещё в скрипте, запущенном плагином WScript не определён - беда. Причём, CreateObject("WScript.Shell") OK, видимо, потому что передано строкой, а WScript.ScriptFullName - облом. echo и quit - та же история.

Добавлено спустя 20 минут:

В общем, вот такая обёртка получилась:

Код: Выделить всё

Dim FS, SC, SH, TS
Set FS           = CreateObject("Scripting.FileSystemObject")
Set SH          = CreateObject("WScript.Shell")
TC                = SH.ExpandEnvironmentStrings("%COMMANDER_PATH%")
Set TS           = FS.OpenTextFile(TC & "\PlugIns\wdx\script\test.js")
TX                = TS.ReadAll()
Set SC          = CreateObject("MSScriptControl.ScriptControl")
SC.Language = "JScript"
SC.AllowUI    = false
SC.AddCode(TX)
TS.Close()
Set TS           = Nothing
content          = SC.Run("FA", filename, FS, SH)
Set SH          = Nothing
Set FS           = Nothing
Set SC          = Nothing
это vbs, а main.js пока такой:

Код: Выделить всё

function FA(e,f,s){
  var u=f.getBaseName(e);
  return(u);
}
Последний раз редактировалось Serge Yolkin Чт окт 17, 2013 19:11, всего редактировалось 1 раз.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Тестируем. Попытался удвоить слеши в filename.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Lev
Спасибо, вроде заработало! А то чтение скрипта из скрипта заметно тормозило на больших папках.

Для тех, кто будет скриптить: надо определить все переменные
Content,
Content1,
...
Content9;
иначе ругается.

Добавлено спустя 19 минут:

Поправил свою обёртку двумя постами выше: вроде, уже и не нужна, а выбросить жалко.
Последний раз редактировалось Serge Yolkin Чт окт 17, 2013 19:26, всего редактировалось 1 раз.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

[fix] Не нужно определять переменные.
Тестируем по тому же адресу.

Кстати, года три назад присобачил передачу пареметра через ini, но не публиковал.

Пример:

Код: Выделить всё

script.ini
[param2]
Script=param2.vbs
parameter=a|b|c|d

Код: Выделить всё

'param2.vbs
cont=Split(parameter,"|")
Content=cont(0)
Content1=cont(1)
развлекайтесь :)
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Lev
Да, всё работает. Ещё раз спасибо.
А WScript имплементировать мона?
Не то, чтобы без него никак, но непривычно...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
Все вышестоящие вопросы сняты? Не было времени ранее ответить.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher
Да. А Васик прикольный...

Добавлено спустя 1 час 48 минут:

Lev
Некоторые системные файлы, такие как pagefile.sys, hiberfil.sys и др. плагин не обрабатывает, т.е. их имена не передаются в скрипт. Я знаю, что к ним нет доступа, но это и хотел обработать скриптом. Можно ли это исправить?

Уточнение: pagefile.sys, hiberfil.sys обрабатываются, если включена обработка каталогов (ParseDirs=1), если выключена - нет.

Предположение: при ParseDirs=0 объект проверяется на файловость/папковость каким-то методом, и, если винда на это не отвечает (файлы-то особенные), считается папкой. Хотя, js-ный fileExists() определяет правильно...

Вывод: можно не исправлять, в скрипте отфильтрую...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin писал(а):Да. А Васик прикольный...
Да - это хорошо. Значит, нашёл статьи про SC. А Васик как Васик, для меня основной прикол в компактности и читабельности кода. В остальном есть и свои +ы и -ы.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher
Как создать ScriptControl в js я знал, даже попробовал, но так проблема (уже исправленная) не решилась. Пришлось делать наоборот, вот и взялся за vbs. Пока чувствую себя, как на протезах. Не знаю: втянусь, или нет. Уж больно привык к длинным конструкциям в одну строчку. Но ковыряю потихоньку. Вот сейчас не нашел в js аналога Asc - пытаюсь на Васике что-то сделать.

Lev
Если я ещё не слишком достал, прошу заменить метод, получающий имена файлов/папок на тот, что с буквой W, а то с юникодными именами извращаться через Shell.Application.nameSpace приходится...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
[cut="Офф."]
Serge Yolkin писал(а):Вот сейчас не нашел в js аналога Asc - пытаюсь на Васике что-то сделать.
Не?[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

[cut]Не. Asc преобразует юникодный символ в код его ANSI-аналога, а для символов, не имеющих аналога выдаёт код 63 - знак вопроса. Т.е. проверка имени файла на юникодность становится простой и приятной, поскольку "?" в именах файлов быть не может. На Сером я уже пару дней народ тереблю по этому поводу.[/cut]
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Тестовый скрипт - проверяет имена файлов на юникодность

Код: Выделить всё

var
 a=new ActiveXObject('Shell.Application'),
 f=new ActiveXObject('Scripting.FileSystemObject'),
 n=a.NameSpace(f.getParentFolderName(filename));

Content=fb(fa(filename));

function fa(e){return(f.getFileName(n.ParseName(f.getFileName(e)).path));}
function fb(e){return(/[^а-яё\x01-\xFF]/i.test(e));}
В целом работает, хотя тестировался на ограниченном наборе файлов, но я не об этом. Тот высокотехнологичный костыль (специалисты, наверняка, обратили внимание) нужен для полученя "нормального" виндового имени файла из короткого (8.3), которое плагин радостно передаёт скрипту.

И ещё, VBS'овский Asc не прокатил: некоторым юникодным (конкретно юникодным) символам он находит удивительные ANSI аналоги.
Ответить