2015-05-07 4 views
0

Существует great answer providing a batch file, что все-таки сделает лучше всего работать с повышенным уровнем и не будет поднимать, если он уже поднят.Как начать java-программу (из .jar) приподнято только с помощью VBScript

Я не хочу распространять пакетный файл с моей программой. Весь ядро ​​ответа таково: VBSScript:

Set UAC = CreateObject("Shell.Application") 
UAC.ShellExecute "[path to the batch file which will run elevated]", "ELEV", "", "runas", 1 

Довольно простой. Поэтому вместо пути к пакетному файлу я хочу использовать путь к файлу jar. Но это не похоже на работу:

Set UAC = CreateObject("Shell.Application") 
UAC.ShellExecute "AutoClient.jar", "ELEV", "", "runas", 1 

**Error:** There is no program associated with this file to perform the operation. Install a program or, if already installed one, create an association control panel "preselectable programs. "

Set UAC = CreateObject("Shell.Application") 
UAC.ShellExecute "javaw -jar AutoClient.jar", "ELEV", "", "runas", 1 

Windows cannot find javaw -jar AutoClient.jar. Make sure you typed the name correctly.

Set UAC = CreateObject("Shell.Application") 
UAC.ShellExecute "javaw", "ELEV", "-jar AutoClient.jar", "runas", 1 

image description

Так хорошо, как я могу запустить баночку из файла VBS ? Оба файла имеют один и тот же каталог. Необходимо, чтобы рабочий каталог java-приложения был , который находится в каталоге.

Edit: Так что спасибо @MCND (и this) теперь я знаю, что аргументы в следующей последовательности:

path to executable to run 
command line parameters sent to the program 
working directory of the new process 
'runas' command which invokes elevation 
0 means do not show the window, 1 to show the window 

И благодаря его коду:

Set UAC = CreateObject("Shell.Application") 
UAC.ShellExecute "javaw.exe", "-jar AutoClient.jar", "", "runas", 1 

Я могу добавить другая ошибка в моей коллекции:

image description

ответ

0

До сих пор, единственный способ, которым я сделал эту работу без безумных ошибок Выпадающих:

' Get the script location, the directorry where it's running 
Set objShell = CreateObject("Wscript.Shell") 

strPath = Wscript.ScriptFullName 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

Set objFile = objFSO.GetFile(strPath) 
strFolder = objFSO.GetParentFolderName(objFile) 

' Args: 
' path to executable to run 
' command line parameters - first parameter of this file, which is the jar file name 
' working directory (this doesn't work but I use it nevertheless) 
' runas command which invokes elevation 
' 0 means do not show the window. Normally, you show the window, but not this console window 
'  which just blinks and disappears anyway 
UAC.ShellExecute "run-normally.bat", "SomeFile.jar, strFolder, "runas", 0 

Поскольку параметр рабочего каталога не работает, У меня есть две строки в файле летучей мыши:

rem Used as a helper for the elevating VBS script. Runs the jar file 
rem given as 1st argument as if the file was double clicked. 

rem Make sure we're on our CURRENT directory 
cd /d %~dp0 
rem Run java, expecting the jar file to be given as the 1st argument 
javaw -jar %1 

Я не удовлетворен этим решением по косметическим соображениям. Я хочу, чтобы отобразить сообщение UAC для JRE, а не командной строки окна:

image description

+0

Я не использую Java, но вы не указываете полные пути. Вы не можете ожидать, что все будет работать надежно. Кроме того, что бы вы ни запускали, вам нужно будет щелкнуть правой кнопкой мыши меню «Запуск от имени администратора», потому что код VBS запускает эту команду меню, как если бы вы ее нажали. Если его там нет, вы не можете его щелкнуть. EXE есть. Поэтому укажите правильные пути как к Javaw, так и к файлу jar. – Trigger

+0

Путь @Trigger к 'javaw.exe' зависит от системы. –

+0

Точно. Поэтому вам нужно что-то сделать. См. Фильтр для пакетного файла, где я могу найти себя (https://skydrive.live.com/redir?resid=E2F0CE17A268A4FA!121). Но главная проблема - файл jar, вы ** надеетесь, что он находится в текущем каталоге. – Trigger

0

В documentation указано, что первым параметром в вызове является файл, который запускается, оставив аргументы второму параметру. Так оно и должно быть (к сожалению, не тестируется)

Set UAC = CreateObject("Shell.Application") 
UAC.ShellExecute "javaw.exe", "-jar AutoClient.jar", "", "runas", 1 
+0

Я извиняюсь, но это один бросает ошибку тоже. Я добавил его в свой вопрос. Мне удалось выполнить эту работу, используя промежуточный файл '.bat'. –

0

Я не использую Java, но вы не задав полные пути. Вы не можете ожидать, что все будет работать надежно. Кроме того, что бы вы ни запускали, вам нужно будет щелкнуть правой кнопкой мыши меню «Запуск от имени администратора», потому что код VBS запускает эту команду меню, как если бы вы ее нажали. Если его там нет, вы не можете его щелкнуть. EXE есть. Поэтому укажите правильные пути как к Javaw, так и к файлу jar.

Одна из проблем заключается в том, что текущий каталог отличается в зависимости от того, какой метод вы используете.ВСЕГДА укажите полные пути.

Вот скрипт, который перечисляет, какие глаголы доступны для объекта (не мы не работаем с файлами, а с объектами). Графическая оболочка (explorer) является браузером объектов и не имеет представления о том, какой файл отличается от того факта, что это объект какого-то типа.

--------------------------- 
Windows Script Host 
--------------------------- 

    ShVerb 

    Lists or runs an explorer verb (right click menu) on a file or folder 

    ShVerb <filename> [verb] 

    Used without a verb it lists the verbs available for the file or folder 

    The program lists most verbs but only ones above the first separator 
    of the menu work when used this way 

    The Properties verb can be used. However the program has to keep running 
    to hold the properties dialog open. It keeps running by displaying 
    a message box. 
--------------------------- 
OK 
--------------------------- 

Сценарий

HelpMsg = vbcrlf & " ShVerb" & vbcrlf & vbcrlf & " David Candy 2014" & vbcrlf & vbcrlf & " Lists or runs an explorer verb (right click menu) on a file or folder" & vbcrlf & vbcrlf & " ShVerb <filename> [verb]" & vbcrlf & vbcrlf & " Used without a verb it lists the verbs available for the file or folder" & vbcrlf & vbcrlf 
HelpMsg = HelpMsg & " The program lists most verbs but only ones above the first separator" & vbcrlf & " of the menu work when used this way" & vbcrlf & vbcrlf 
HelpMsg = HelpMsg & " The Properties verb can be used. However the program has to keep running" & vbcrlf & " to hold the properties dialog open. It keeps running by displaying" & vbcrlf & " a message box." 
Set objShell = CreateObject("Shell.Application") 
Set Ag = WScript.Arguments 
set WshShell = WScript.CreateObject("WScript.Shell") 
Set fso = CreateObject("Scripting.FileSystemObject") 

    If Ag.count = 0 then 
     wscript.echo " ShVerb - No file specified" 
     wscript.echo HelpMsg 
     wscript.quit 
    Else If Ag.count = 1 then 
     If LCase(Replace(Ag(0),"-", "/")) = "/h" or Replace(Ag(0),"-", "/") = "/?" then 
      wscript.echo HelpMsg 
      wscript.quit 
     End If 
    ElseIf Ag.count > 2 then 
     wscript.echo vbcrlf & " ShVerb - To many parameters" & vbcrlf & " Use quotes around filenames and verbs containing spaces" & vbcrlf 
     wscript.echo HelpMsg 
     wscript.quit 
    End If 

    If fso.DriveExists(Ag(0)) = True then 
     Set objFolder = objShell.Namespace(fso.GetFileName(Ag(0))) 
'  Set objFolderItem = objFolder.ParseName(fso.GetFileName(Ag(0))) 
     Set objFolderItem = objFolder.self 
     msgbox ag(0) 
    ElseIf fso.FolderExists(Ag(0)) = True then 
     Set objFolder = objShell.Namespace(fso.GetParentFolderName(Ag(0))) 
     Set objFolderItem = objFolder.ParseName(fso.GetFileName(Ag(0))) 
    ElseIf fso.fileExists(Ag(0)) = True then 
     Set objFolder = objShell.Namespace(fso.GetParentFolderName(Ag(0))) 
     Set objFolderItem = objFolder.ParseName(fso.GetFileName(Ag(0))) 
    Else 
     wscript.echo " ShVerb - " & Ag(0) & " not found" 
     wscript.echo HelpMsg 
     wscript.quit 
    End If 

    Set objVerbs = objFolderItem.Verbs 

    'If only one argument list verbs for that item 

    If Ag.count = 1 then 
     For Each cmd in objFolderItem.Verbs 
      If len(cmd) <> 0 then CmdList = CmdList & vbcrlf & replace(cmd.name, "&", "") 
     Next 
     wscript.echo mid(CmdList, 2) 

    'If two arguments do verbs for that item 

    ElseIf Ag.count = 2 then 
     For Each cmd in objFolderItem.Verbs 
      If lcase(replace(cmd, "&", "")) = LCase(Ag(1)) then 
       wscript.echo(Cmd.doit) 
       Exit For 
      End If 
     Next 
    'Properties is special cased. Script has to stay running for Properties dialog to show. 
     If Lcase(Ag(1)) = "properties" then 
      WSHShell.AppActivate(ObjFolderItem.Name & " Properties") 
      msgbox "This message box has to stay open to keep the " & ObjFolderItem.Name & " Properties dialog open." 
     End If 
    End If 
End If