101

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Господа, я прошу прощения, но я не полностью понимаю ход ваших мыслей и в частности, что такое "инлайновый метод".
Давайте я ещё раз сформулирую стоящую передо мной задачу:
Мне надо прикрепить программу на панель задач с помощью одной строки кода без дополнительных файлов. Путь к этому файлу известен заранее. Код запускается из конфигурационного файла SFX-модуля 7-zip. Код планируется запускать через mshta. То есть в конфигурационном файле должна быть строка вида:

RunProgram="mshtа <код>"

В такой записи, насколько мне известно, есть ограничение на длину кода.

Насколько я понял здесь и здесь предложены рабочие варианты кода? Или их работоспособность надо ещё проверить на иноязычних системах?

102

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Под инлайновым Xameleon имеет ввиду однострочник.

Насчёт рабочих вариантов. На 7-ке мой вариант уже можно не проверять. См. 10-ку. Есть mui из неё?

103

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

У меня 10 rus. Подойдет из неё? Или надо другие языки?

104

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Подойдёт. Хотя можно ещё парочку. А со сменой локали ничего не появилось?

105

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Что-то у меня ваш скрипт на 10 вылетает с ошибкой:

Сценарий:	G:\XP\MyInstallers\7z\!!!Tools\1.vbs
Строка:	20
Символ:	27
Ошибка:	Недопустимый вызов или аргумент процедуры
Код:	800A0005
Источник: 	Ошибка выполнения Microsoft VBScript

Opera.exe и в Program Files и в Program Files(x86).
Вот shell32.dll.mui из моей системы.
Немного не понял про смену локали - вы имеете в виду систему с несколькими языками?

106

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
А, забыл, что там нет одной нулёвки. Тогда не буду обрезать цикл. Всё равно на фоне процесса прикрепления это неощутимые миллисекунды. См. сейчас.
Про смену - верно. Я же привёл команду в скобках.

107

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Попробовал исправленный скрипт - ошибки нет, но не прикрепляется... Скрипт просто завершается без видимых последствий...
Про смену локали - у меня не установлено ни одной мультиязычной системы. На моих системах предлагается изменить язык системы только для программ не поддерживающих Юникод.

108

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Если ярлык с таким именем уже есть в папке, то дубль прикрепляться не будет.
Нужно изъять с панели перед тестом.

109

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Я, конечно же, предварительно открепил оперу от панели задач. Потом ещё запустил поиск ярлыков оперы в C:\Users - ничего не нашел.
Проверил на 8 - все работает. Может у меня 10 загаженная? Попробую завтра установить начисто на виртуалке...

110

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Вставьте MsgBox True между 8 и 9 строками. Появится сообщение?

111

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Я вставил туда

msgbox(Link)
msgbox(WSS.Environment("Process")("PROGRAMFILES") & "\Opera\Opera.exe")

Все отображается - и путь к ярлыку и путь к опере. Поэтому я и грешу на загаженость системы.

112

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Туда - это конкретно между 8 и 9 строками?
Тогда Msgbox Verb между двумя циклами (18, 19 строками).

113

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
На первый вопрос - ответ "да".

Flasher пишет:

Тогда Msgbox Verb между двумя циклами (18, 19 строками).

Выдает "&Закрепить на панели задач".

114

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Т.е. код верный. Можно убрать проверочное. Есть вероятность, что метод DoIt просто не успевает выполнить команду. Я с таким раньше сталкивался при вызове диалогов. Попробуйте в конце кода задержку секунды на 3 добавить:

WSH.Sleep 3000

115

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Задержка не помогла. Вставил ещё один Msgbox:

....
 		For Each V In Opera.Verbs
Msgbox V.Name
 			If V.Name = Verb Then V.DoIt : Exit For
 		Next
....

И вот, что интересно - "&Закрепить на панели задач" не появилось. Посмотрел по ПКМ - удивительно, но в Проводнике "&Закрепить на панели задач" есть, а в TotalCommander-e  - нет.

116

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Не появилось? Но тогда и эта строка не может там работать. ПКМ на .exe у меня в ТС прекрасно всё отображает. И к работе скрипта это в любом случае отношения не имеет.

117

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher пишет:

И к работе скрипта это в любом случае отношения не имеет.

Вот и я грешу на свою систему, а не на скрипт... Буду экспериментировать.
Теперь вопрос, как преобразовать ваш скрипт в однострочник? Меня смущает Exit For в 16 и 20 строках...

118 (изменено: koros, 2017-02-15 11:00:55)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
И еще просьба: Не могли бы вы пояснить, почему в 3 строке NameSpace(0) (насколько я понял - это папка "Рабочий стол"). Разве здесь не надо использовать ту же папку, что и в ParseName?

119

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros

Set WSS=CreateObject("WScript.Shell"):VPlus=WSS.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")>"5.1":Set Opera=CreateObject("Shell.Application").NameSpace(0).ParseName(WSS.Environment("Process")("PROGRAMFILES")&"\Opera\Opera.exe"):If VarType(Opera)=9 Then WSH.Quit:End If:If VPlus Then Chain="User Pinned\TaskBar\":End If:Desc=Opera.ExtendedProperty("FileDescription"):Link=WSS.Environment("Process")("APPDATA")&"\Microsoft\Internet Explorer\Quick Launch\"&Chain&Desc&".lnk":If Not CreateObject("Scripting.FileSystemObject").FileExists(Link) Then:If VPlus Then:With CreateObject("MSXML2.XMLHTTP"):.Open "GET","res://shell32.dll/6/337",False:.Send:B=.ResponseBody:.Abort:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:For Each V In Opera.Verbs:If V.Name=Verb Then V.DoIt:Exit For End If:Next:Else:With WSS.CreateShortcut(Link):.TargetPath=Opera.Path:.Description=Desc:.Save:End With:End If:End If

В ParseName располагается путь относительно NameSpace. Поэтому там может быть как полный путь (при 0-е), так и относительный.
С 0-м запись короче. И в ряде случаев, когда перебираешь файлы в структуре, куда проще подставлять переменную с путём к уже полученному объекту папки.

120

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Спасибо. Но этот код не запускается через mshta. Я думаю, что это из-за того, что он слишком длинный.
Пока попытался запустить через mshta только основополагающую часть:

mshta vbscript:execute("With CreateObject(""MSXML2.XMLHTTP""):.Open ""GET"",""res://shell32.dll/6/337"",False:.Send:B=.ResponseBody:.Abort:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:Close")

Выдаёт ошибку, что "Разрешение отклонено".
Эта же ошибка вылетает даже, если просто запустить:

mshta vbscript:execute("With CreateObject(""MSXML2.XMLHTTP""):.Open ""GET"",""res://shell32.dll/6/337"",False:.Send:B=.ResponseBody:.Abort:End With:Close")

121

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Не понял, в чём состоит основоположность (кроме записи в переменную там ничего по сути нет), ну ладно.
Я бы рад помочь с mshta, но у меня там другой описанный ранее глюк с выводом окна. Никаких ошибок нв Win7 не наблюдаю.
Кстати, без mshta работает?

122

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Основоположность - в сути метода. То есть определение "глагола" через res://shell32.dll/6/337.
Я проверил код без mhta:

With CreateObject("MSXML2.XMLHTTP"):.Open "GET","res://shell32.dll/6/337",False:.Send:B=.ResponseBody:.Abort:End With
msgbox b

Работает.
Через mshta:

mshta vbscript:execute("With CreateObject(""MSXML2.XMLHTTP""):.Open ""GET"",""res://shell32.dll/6/337"",False:.Send:B=.ResponseBody:.Abort:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:msgbox b:Close")

Выдает ошибку "Разрешение отклонено".
Может CreateObject(""MSXML2.XMLHTTP"") не работает черех mshta. Например, насколько я знаю, объекта WScript в mshta нет и, например, WScript.Quit не работает через mshta.

123

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Немного модифицировал код Flasher-a в плане чтения.


mshta vbscript:execute("With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:B=.Read:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:msgbox b:Close")

У меня на Win 10 выдаёт:

Открыть с помощь&юОткрыть с помощь&ю...&Выбрать другое приложение2Открытие документа с помощью конкретной программы."Открытие документа с помощью "%s". &Выбрать приложение по умолчанию&Поиск в Магазине'Открытие Магазина для поиска приложения'Добавление этого элемента в меню "Пуск"&Удаление этого элемента из меню "Пуск"&Закрепить на панели задач&Открепить от панели задач*Закрепляет это приложение на панели задач.)Открепляет это приложение с панели задач.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

124

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Я имел в виду мой код, а не данный кусок.

koros пишет:

Может CreateObject(""MSXML2.XMLHTTP"") не работает черех mshta.

Так проверьте:

mshta vbscript:execute("Set XML=CreateObject(""MSXML2.XMLHTTP""):Close")
koros пишет:

WScript.Quit не работает через mshta.

Если речь про WSH.Quit в моём коде, то вместо него всю нижеследующую часть кода можно завернуть в условие:

If VarType(Opera) = 8 Then
...
End If

Xameleon
Verb вместо b в конце.

125 (изменено: Xameleon, 2017-02-15 15:20:38)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher,

Verb вместо b в конце.

Ааа, вот оно в чём дело. Не обратил внимания. А у Вас в коде "MsgBox b" используется для отладки ?

Решил попробовать собрать свой вариант:

mshta vbscript:execute("With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:Do While Not.EOS:l=AscB(.Read(2))*2:n=n+1:if l>0 Then v=.Read(l):if n=11 Then msgbox v:Exit Do:End if:End if:Loop:End With:Close")
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !