проблема запуска Java-процесса PowerShell - PullRequest
6 голосов
/ 13 января 2011

Я пытаюсь запустить процесс Java через Powershell в Windows XP. Вот команда:

java.exe -cp .;./common.jar -Dcontext=atest1 -Dresourcepath=. DW_Install

Итак, путь к классу есть. и. \ common.jar (я думаю, что java использует неправильные слэши, верно?) Есть две переменные окружения, одна "atest1", другая "." и класс для выполнения main - это DW_Install (в пакете по умолчанию).

Эта команда работает в cmd.exe, но не является PS. В чем дело? Что делает PS при разборе этой команды, чего не делает CMD (или наоборот)?

Aaron

Ответы [ 5 ]

7 голосов
/ 18 января 2011

Проблема в том, что PS почему-то анализирует -Dresourcepath=. иначе, чем cmd.То, что работает, это

java -cp '.;.\common.jar' -Dcontext=atest1 "-Dresourcepath=." DW_Install

Не имеет значения, в каком направлении идет косая черта, и не имеет значения, какие цитаты используются (' или ").Однако, путь к классам должен быть экранирован с помощью кавычек.Хороший тест, чтобы увидеть, что получает интерпретатор PS, это повторить его.Следующее:

echo java -cp '.;.\common.jar' -Dcontext=atest1 -Dresourcepath=. DW_Install

дает следующий вывод:

java
-cp
.;.\common.jar
-Dcontext=etaste1
-Dresourcepath=
.
DW_Install

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

echo java -cp '.;.\common.jar' -Dcontext=atest1 '-Dresourcepath=.' DW_Install

приводит к следующему выводу:

java
-cp
.;.\common.jar
-Dcontext=etaste1
-Dresourcepath=.
DW_Install

Что нам гораздо больше нравится.

Хотя я не желаю этого никому из вас, я надеюсь, что этот пост поможет темиз вас, которые должны развернуть проекты Java на машинах Windows (даже если они никогда не будут работать на любой другой платформе).

5 голосов
/ 14 января 2011

Запуск внешних программ командной строки из PowerShell иногда немного проблематичен, потому что там PowerShell предоставляет два разных режима синтаксического анализа, которые перекрываются различными синтаксисами указанных внешних программ.

В любом случае, запуск команды вPowershell требует использования префикса . ( dot- "sourcing" ) или оператора &.

Это можно обойти, передав каждый параметр во внешнюю программу как отдельные переменныевот так:

PS> $classpath = ".;./common.jar"
PS> $env = "-Dcontext=atest1 -Dresourcepath=."
PS> $class = "DW_Install"

PS> . java.exe -cp $classpath $env $class
3 голосов
/ 24 сентября 2011

Другой пример, основанный на https://gaming.stackexchange.com/questions/24543/how-do-i-change-player-name-in-minecraft-multiplayer-in-offline-mode-in-linux

function mineCraftAs {
    Param (
        [parameter(mandatory=$true, HelpMessage="Minecraft character name." ,ValueFromPipeline=$true)]
        [string] $name
    )
    if(!(test-path $env:appdata)) { $(throw "Appdata not found at $env:appdata")}
    $private:minecraftPath=Join-Path $env:appdata .minecraft
    if(!(test-path $minecraftPath)) { $(throw "Minecraft not found at $minecraftpath")}
    $private:minebinPath=join-path $minecraftPath "bin"
    if(!(test-path $minebinPath)) { $(throw "Minecraft bin not found at $minebinPath")}

    $minebinPath | write-debug
    gci $minebinpath | write-debug

    #java -Xms512m -Xmx1024m -cp "%APPDATA%/.minecraft\bin\*" -Djava.library.path="%APPDATA%\.minecraft\bin\natives" net.minecraft.client.Minecraft '"'%1'"'

    echo java -Xms512m -Xmx1024m  -cp ('"'+$minebinPath+'\*"') ('-Djava.library.path="'+$minebinPath+'\natives"') net.minecraft.client.Minecraft ($name)

    $minecraftJob=& 'C:\Program Files (x86)\Java\jre6\bin\java.exe' -Xms512m -Xmx1024m  -cp ('"'+$minebinPath+'\*"') ('-Djava.library.path="'+$minebinPath+'\natives"') net.minecraft.client.Minecraft ($name)
}
minecraftas newbie
1 голос
/ 15 января 2011

Должно работать следующее:

java.exe -cp '.;./common.jar' -Dcontext=atest1 -Dresourcepath=. DW_Install

Я предполагаю, что PowerShell интерпретирует ; в пути к классам как разделитель команд, тем самым пытаясь запустить java -cp . и ./common.jar -D....

0 голосов
/ 23 марта 2018
start-process -nnw java "-cp .;./common.jar -Dcontext=atest1 -Dresourcepath=. DW_Install"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...