запустить java.exe с аргументами из powershell

Я пытаюсь вызвать wlst/jython/python из powershell

установить classpath с помощью setWLSEnv.cmd не в правильном сеансе? поэтому я попытался установить -cp в качестве аргумента

& C:\bea\tpc\weblogic1033\server\bin\setWLSEnv.cmd; 
$cp='C:\bea\tpc\WEBLOG~1\server\lib\weblogic.jar'
$wlst='weblogic.WLST'
$script='C:\domains\tpc\Domain\bin\status.py'
$java="C:\PROGRA~1\Java\JROCKI~1.0\bin\java"
& "$java $cp $wlst $script"
#or
. "`"$java`" -cp `"$cp`" $wlst `"$script`""
#or
& "`"$java`" -cp `"$cp`" $wlst `"$script`""

Я пытался процитировать командную строку разными способами, но безуспешно.

Термин '"C:\PROGRA~1\Java\JROCKI~1.0\bin\java" -cp "C:\bea\tpc\WEBLOG~1\server\lib\weblogic.jar" weblogic.WLST "C:\ domains\tpc\SasTT pcDomain\bin\status.py"' ​​не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был указан путь, убедитесь, что путь указан правильно, и повторите попытку. В C:_WORK_\SAS\statusAll.ps1:15 char:2 + . ‹‹‹‹ ""$java" -cp "$cp" $wlst "$script"" + CategoryInfo : ObjectNotFound: ("C:\PROGRA~1\Ja...\bin\status.py":String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException


person ReneHH    schedule 14.01.2013    source источник


Ответы (2)


Когда вы используете оператор вызова &, следующим токеном должно быть имя команды и ничего больше. Итак, вместо этого:

& "$java $cp $wlst $script"

Попробуй это:

& $java $cp $wlst $script

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

Invoke-Expression "$java $cp $wlst $script"
person Keith Hill    schedule 14.01.2013

В дополнение к проблемам с форматированием команды в строку, setWLSEnv.cmd — это сценарий для командной строки Windows. PowerShell не может выполнить этот файл; он не знает, как его интерпретировать, так же, как Блокнот не знает, как интерпретировать файл docx. Windows связывает файлы .cmd с командной строкой, поэтому ваша первая строка эквивалентна

& cmd.exe /c C:\bea\tpc\weblogic1033\server\bin\setWLSEnv.cmd

(Обратите внимание, что точка с запятой не нужна, так как у вас нет других команд в той же строке.)

Это создает новый процесс с помощью cmd.exe. Этот новый процесс выполняет пакетный файл, устанавливая ожидаемые переменные среды, а затем процесс завершается, отбрасывая изменения среды.

Если вам нужно setWLSEnv.cmd установить переменные среды перед выполнением вашей программы, вы должны написать пакетный файл, который вызывает его, а не сценарий PowerShell. В противном случае вам нужно будет найти или написать эквивалент PowerShell для настройки вашей среды.

person jpmc26    schedule 15.01.2013
comment
Как я думал. Я просто надеялся, что есть какая-то магия, которая может заставить его выполняться в правильном сеансе, как в unix . ./env.sh - person ReneHH; 15.01.2013
comment
В качестве альтернативы вы можете использовать команду Invoke-BatchFile в расширениях сообщества PowerShell (pscx.codeplex.com), которая выполнить пакетный файл и распространить изменения среды обратно в процесс PowerShell. - person Keith Hill; 15.01.2013
comment
@ReneHH PowerShell имеет эквивалент, но он работает только с файлами PowerShell, точно так же, как производные sh могут интерпретировать только файлы, написанные на их диалекте. Дело не в том, что PowerShell не хватает функциональности; дело в том, что PowerShell и командная строка — это два очень, очень разных типа оболочек командной строки. Попросить PowerShell запустить файл .cmd — это то же самое, что попросить производную от sh запустить пакетный файл. - person jpmc26; 17.01.2013