PDA

Показать полную графическую версию : [решено] Запись VBScript/Jscript в одну строку


ya158
20-09-2014, 16:10
Как известно можно запустит VBScript/Jscript из батника через mshta. При этом всё записывается в одну строку. Например
mshta.exe vbscript:close(CreateObject("WScript.Shell").Popup("MessageString",0,"Title",16))


Как аналогичным образом добавить/удалить программу на taskbar в Win7/8?
Пример скрипта http://forum.ru-board.com/topic.cgi?forum=62&topic=23213&start=3940#21.
Мне надо преобразовать его в вид mshta.exe vbscript:.......

Iska
20-09-2014, 16:56
ya158, ответ на главный вопрос как обычно остался скромно обойдён вниманием: зачем, собственно?

ya158
20-09-2014, 18:11
Iska,
Ну, например, чтобы не делать отдельный vbs-скрипт, а закреплять программу на таскбаре из батника или SFX-архива.

Стесняюсь спросить, а по сабжу есть какие-нибудь мысли?

Iska
21-09-2014, 02:31
Ну, например, чтобы не делать отдельный vbs-скрипт, а закреплять программу на таскбаре из батника или SFX-архива. »
ya158, ровно тем же образом можно делать сие из скрипта, без применения промежуточного пакетного файла или самораспаковывающегося архива.

Стесняюсь спросить, а по сабжу есть какие-нибудь мысли? »
Я их изложил. По поводу Вашей хотелки: если кто восхочет — сделает Вам реализацию.

ya158
21-09-2014, 20:38
ровно тем же образом можно делать сие из скрипта »
Подскажите, плиз, как это сделать?
Я не специалист в VBScript/Jscript, поэтому использую батники. Помимо этого батник можно записать в одну строку => можно не создавать отдельный файл. Я в курсе, что можно сделать комбинированный скрипт вида:
@set @x=0 /*
@echo off
cmdow @ /HID

Батник
wscript //nologo /e:jscript "%~f0"
Батник
*/
VBScript
Но так получается внедрить только один скрипт. При помощи же mshta можно в батник вставить различные VBScript/Jscript. Вот несколько примеров http://www.dostips.com/forum/viewtopic.php?f=3&t=5311

Iska
22-09-2014, 15:29
Но так получается внедрить только один скрипт. »
Один файл, много скриптов: WSH: пишем сценарии в формате WSF (http://forum.script-coding.com/viewtopic.php?id=1149).

ya158
23-09-2014, 12:17
Iska,
Спасибо, конечно за ссылку, но я там не увидел батников. Да и честно сказать, я не специалист в VBScript/Jscript,, а тут еще надо разбираться с WSF :(.
Но самое главное - мне надо записать команды в одну строку, а не создавать ещё один файл. Это даёт возможность записать такую строку в реестре напрямую, а не запускать из реестра какой-либо дополнительный файл.

Iska
23-09-2014, 18:49
ya158, Вы спросили, как сие можно сделать, я Вам показал — как: написать сценарий в формате .wsf, один-единственный файл, в котором может содержаться произвольное количество заданий на VBScript/JScript.

Это даёт возможность записать такую строку в реестре напрямую »
1. Не вижу никаких препятствий для того, чтобы делать сие из .wsf.
2. Напрямую — это сказки, дружище. Особенно в реестр. Попробуйте записать для исполнения в реестр что-нибудь наподобие такого: CMD/BAT: получение формата дата-время для имени файла (http://forum.script-coding.com/viewtopic.php?id=5066) или такого: CMD/BAT: использование стандартных GUI-диалогов выбора папки и файла (http://forum.script-coding.com/viewtopic.php?id=4514). Куча счастья и радости в процессе будет обеспечена, гарантирую.

И разбираться с VBScript/JScript Вам придётся. А как же иначе?! Ведь именно их Вы собираетесь пользовать в «mshta.exe».

ya158
29-09-2014, 00:51
Всё таки с помощью wrace (http://forum.oszone.net/member.php?u=50016) я получил то, что хотел.
Выложу здесь, может кому пригодится.

VBScript
mshta.exe vbscript:Execute("dim exe: exe=""%WinDir%\explorer.exe"":Set fs = CreateObject(""scripting.Filesystemobject""):Set colVerbs = CreateObject(""Shell.Application"").Namespace(fs.GetParentFolderName(exe)).ParseName(fs.GetFileName(exe)).Verbs:For Each objVerb in colVerbs: If Mid(Replace(objVerb.name, ""&"", """"),3,7) = ""крепить"" Then objVerb.DoIt: exe = objVerb.name End If: Next:close")

JavaScript
mshta.exe "javascript:var fs = new ActiveXObject('Scripting.FileSystemObject'); var exe='C:\\Windows\\explorer.exe'; var colVerbs = new ActiveXObject('Shell.Application').Namespace(fs.GetParentFolderName(exe)).ParseName(fs.GetFileName(e xe)).Verbs(); var k=-1; for(var i=colVerbs.Count; --i>=0;){ var objVerb=colVerbs.Item(i).name.replace('&', ''); if (objVerb.substr(2,7) == 'крепить'){ k=i; colVerbs.Item(k).DoIt(); } } close(new ActiveXObject('WScript.Shell').Popup(k,0,'Title',16));"

Iska
06-12-2014, 14:11
Из письма в PM:
Здравствуйте!
Прошу помощи в решении следующей задачи. Мне надо с помощью mshta считать текст из текстового файла и записать в реестр. Текстовый файл состоит из нескольких строк. В принципе работает следующий скрипт:
mshta vbscript:close(CreateObject("WScript.Shell").RegWrite("HKLM\New\Param",CreateObject("Scripting.FileSystemObject").GetFile("c:\1.txt").OpenAsTextStream(1).ReadAll(),"REG_SZ"))
Но заковыка в том, что c:\1.txt в кодировке cp866. Поэтому в HKLM\New\Param попадают кракозябры.
Поискал как с помощью VBSscript перекодировать файл из cp866 в ANSI и нашел этот (http://forum.oszone.net/post-1894955-10.html) Ваш пост. В нем решается похожая задача. Я попытался сделать что-то вроде
mshta vbscript:execute("set f=CreateObject(""Scripting.FileSystemObject""):set a=(CreateObject(""ADODB.Stream"")):a.Type=2:a.Mode=3:a.Open():a.Charset=""windows-1251"": a.LoadFromFile(""C:\1.txt""):T=a.ReadText():a.Position=0:a.Charset=""cp866"":a.WriteText(T):a.SaveToFile(""C:\UTF-8.txt""):a.Close():close")
Но вылетает ошибка:

Настройки безопасности данного компьютера запрещают доступ к источнику данных в другом домене

Прошу помощи в написании рабочего скрипта на VBScript.

Заранее спасибо.
С уважением, Роман.
Коллега, я уже излагал Вам свои мысли на тему «как почесать задней левой ногой за правым ухом» в данной теме выше.

С тех пор ничего не изменилось.

ya158
08-12-2014, 23:14
Iska,
Большое спасибо за поддержку и реальную помощь новичку в VBScript. Отдельное спасибо за прикрепление письма из лички - сам бы я, наверное, не справился бы. Отдельное спасибо за мудрый совет:
«как почесать задней левой ногой за правым ухом» »
Следуя ему я решил не заморачиваться с .wsf, а сделать ровно то, о чем спрашивал лично у Вас в ПМ.

Как и раньше отвечу сам себе (может кому-то пригодиться). Скрипт делал сам, поэтому он может быть не совсем кошерным, но работает :).
Итак для перекодирования файла C:\1.txt из cp866 в ANSI и записи содержимого этого файла в реестр можно воспользоваться таким кодом:
mshta vbscript:execute("f=CreateObject(""Scripting.FileSystemObject"").GetFile(""C:\1.txt"").OpenAsTextStream(1).ReadAll():with CreateObject(""ADODB.Stream""):.Type=2:.Mode=3:.Open():.Charset=""windows-1251"":.WriteText(f):.Position=0:.Charset=""cp866"":S=.ReadText end with:a=CreateObject(""WScript.Shell"").RegWrite(""HKLM\NewKey\Param"",S,""REG_SZ""):close")
Получается интересный эффект. В C:\1.txt содержится несколько строк (это могут быть команды батника, например), а тип параметра - REG_SZ и данные записываются в одну строку. Если потом в regedit скопировать данные из этого параметра и вставить в текстовый файл, то данные опять разобьются на строки. Таким образом, в REG_SZ можно записать несколько строк, как в REG_MULTI_SZ. Может это давно известный факт, но я о таком не слышал.

Iska
08-12-2014, 23:29
Iska,
Большое спасибо за поддержку и реальную помощь новичку в VBScript. Отдельное спасибо за прикрепление письма из лички - сам бы я, наверное, не справился бы. Отдельное спасибо за мудрый совет: »
ya158, завсегда пожалуйста. Рад был помочь. Обращайтесь, если что.

Если потом в regedit скопировать данные из этого параметра и вставить в текстовый файл, то данные опять разобьются на строки. Таким образом, в REG_SZ можно записать несколько строк, как в REG_MULTI_SZ. Может это давно известный факт, но я о таком не слышал. »
Ничего странного. Вы пишете в REG_SZ в числе прочего концы строк 0x0D, 0x0A. Затем читаете — и получаете их же.




© OSzone.net 2001-2012