Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Запись VBScript/Jscript в одну строку (http://forum.oszone.net/showthread.php?t=288213)

ya158 20-09-2014 16:10 2405156

Запись VBScript/Jscript в одну строку
 
Как известно можно запустит 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?...&start=3940#21.
Мне надо преобразовать его в вид mshta.exe vbscript:.......

Iska 20-09-2014 16:56 2405169

ya158, ответ на главный вопрос как обычно остался скромно обойдён вниманием: зачем, собственно?

ya158 20-09-2014 18:11 2405191

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

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

Iska 21-09-2014 02:31 2405307

Цитата:

Цитата ya158
Ну, например, чтобы не делать отдельный vbs-скрипт, а закреплять программу на таскбаре из батника или SFX-архива. »

ya158, ровно тем же образом можно делать сие из скрипта, без применения промежуточного пакетного файла или самораспаковывающегося архива.

Цитата:

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

Я их изложил. По поводу Вашей хотелки: если кто восхочет — сделает Вам реализацию.

ya158 21-09-2014 20:38 2405502

Цитата:

Цитата Iska
ровно тем же образом можно делать сие из скрипта »

Подскажите, плиз, как это сделать?
Я не специалист в 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 2405732

Цитата:

Цитата ya158
Но так получается внедрить только один скрипт. »

Один файл, много скриптов: WSH: пишем сценарии в формате WSF.

ya158 23-09-2014 12:17 2406103

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

Iska 23-09-2014 18:49 2406226

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

Цитата:

Цитата ya158
Это даёт возможность записать такую строку в реестре напрямую »

1. Не вижу никаких препятствий для того, чтобы делать сие из .wsf.
2. Напрямую — это сказки, дружище. Особенно в реестр. Попробуйте записать для исполнения в реестр что-нибудь наподобие такого: CMD/BAT: получение формата дата-время для имени файла или такого: CMD/BAT: использование стандартных GUI-диалогов выбора папки и файла. Куча счастья и радости в процессе будет обеспечена, гарантирую.

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

ya158 29-09-2014 00:51 2408134

Всё таки с помощью wrace я получил то, что хотел.
Выложу здесь, может кому пригодится.

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(exe)).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 2440323

Из письма в PM:
Скрытый текст
Цитата:

Цитата ya158
Здравствуйте!
Прошу помощи в решении следующей задачи. Мне надо с помощью 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 и нашел этот Ваш пост. В нем решается похожая задача. Я попытался сделать что-то вроде
Код:

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 2441521

Iska,
Большое спасибо за поддержку и реальную помощь новичку в VBScript. Отдельное спасибо за прикрепление письма из лички - сам бы я, наверное, не справился бы. Отдельное спасибо за мудрый совет:
Цитата:

Цитата Iska
«как почесать задней левой ногой за правым ухом» »

Следуя ему я решил не заморачиваться с .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 2441526

Цитата:

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

ya158, завсегда пожалуйста. Рад был помочь. Обращайтесь, если что.

Цитата:

Цитата ya158
Если потом в regedit скопировать данные из этого параметра и вставить в текстовый файл, то данные опять разобьются на строки. Таким образом, в REG_SZ можно записать несколько строк, как в REG_MULTI_SZ. Может это давно известный факт, но я о таком не слышал. »

Ничего странного. Вы пишете в REG_SZ в числе прочего концы строк 0x0D, 0x0A. Затем читаете — и получаете их же.


Время: 15:07.

Время: 15:07.
© OSzone.net 2001-