Страница 7 из 16
Добавлено: Ср окт 16, 2013 23:57
Serge Yolkin
Flasher
??? Content и так неплохо передаётся, к тому же, я имею возможность сформировать его в любом виде. Проблема в filename, но её я не передаю, а получаю.
Добавлено: Чт окт 17, 2013 00:01
Flasher
Serge Yolkin
Аналогично. Попробуй сразу получать пути через SC.
Добавлено: Чт окт 17, 2013 02:20
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=, или подобное...
Добавлено: Чт окт 17, 2013 09:02
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);
}
Добавлено: Чт окт 17, 2013 18:01
Lev
Тестируем. Попытался удвоить слеши в filename.
Добавлено: Чт окт 17, 2013 19:13
Serge Yolkin
Lev
Спасибо, вроде заработало! А то чтение скрипта из скрипта заметно тормозило на больших папках.
Для тех, кто будет скриптить: надо определить все переменные
Content,
Content1,
...
Content9;
иначе ругается.
Добавлено спустя 19 минут:
Поправил свою обёртку двумя постами выше: вроде, уже и не нужна, а выбросить жалко.
Добавлено: Чт окт 17, 2013 19:25
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)
развлекайтесь :)
Добавлено: Пт окт 18, 2013 00:14
Serge Yolkin
Lev
Да, всё работает. Ещё раз спасибо.
А WScript имплементировать мона?
Не то, чтобы без него никак, но непривычно...
Добавлено: Пт окт 18, 2013 00:35
Flasher
Serge Yolkin
Все вышестоящие вопросы сняты? Не было времени ранее ответить.
Добавлено: Пт окт 18, 2013 10:01
Serge Yolkin
Flasher
Да. А Васик прикольный...
Добавлено спустя 1 час 48 минут:
Lev
Некоторые системные файлы, такие как pagefile.sys, hiberfil.sys и др. плагин не обрабатывает, т.е. их имена не передаются в скрипт. Я знаю, что к ним нет доступа, но это и хотел обработать скриптом. Можно ли это исправить?
Уточнение: pagefile.sys, hiberfil.sys обрабатываются, если включена обработка каталогов (ParseDirs=1), если выключена - нет.
Предположение: при ParseDirs=0 объект проверяется на файловость/папковость каким-то методом, и, если винда на это не отвечает (файлы-то особенные), считается папкой. Хотя, js-ный fileExists() определяет правильно...
Вывод: можно не исправлять, в скрипте отфильтрую...
Добавлено: Сб окт 19, 2013 16:52
Flasher
Serge Yolkin писал(а):Да. А Васик прикольный...
Да - это хорошо. Значит, нашёл статьи про SC. А Васик как Васик, для меня основной прикол в компактности и читабельности кода. В остальном есть и свои +ы и -ы.
Добавлено: Сб окт 19, 2013 17:43
Serge Yolkin
Flasher
Как создать ScriptControl в js я знал, даже попробовал, но так проблема (уже исправленная) не решилась. Пришлось делать наоборот, вот и взялся за vbs. Пока чувствую себя, как на протезах. Не знаю: втянусь, или нет. Уж больно привык к длинным конструкциям в одну строчку. Но ковыряю потихоньку. Вот сейчас не нашел в js аналога Asc - пытаюсь на Васике что-то сделать.
Lev
Если я ещё не слишком достал, прошу заменить метод, получающий имена файлов/папок на тот, что с буквой W, а то с юникодными именами извращаться через Shell.Application.nameSpace приходится...
Добавлено: Сб окт 19, 2013 18:02
Flasher
Serge Yolkin
[cut="Офф."]
Serge Yolkin писал(а):Вот сейчас не нашел в js аналога Asc - пытаюсь на Васике что-то сделать.
Не?[/cut]
Добавлено: Сб окт 19, 2013 18:53
Serge Yolkin
[cut]Не. Asc преобразует юникодный символ в код его ANSI-аналога, а для символов, не имеющих аналога выдаёт код 63 - знак вопроса. Т.е. проверка имени файла на юникодность становится простой и приятной, поскольку "?" в именах файлов быть не может. На Сером я уже пару дней народ тереблю по этому поводу.[/cut]
Добавлено: Вт ноя 05, 2013 13:17
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 аналоги.