powershell运行java进程问题

时间:2011-01-13 20:59:44

标签: java command-line powershell

我正在尝试通过Windows XP中的Powershell运行java进程。这是命令:

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

所以,类路径是。和。\ common.jar(我认为java采用了错误的斜杠,对吧?)有两个环境变量,一个是“atest1”,另一个是“。”并且执行main的类是DW_Install(在默认包中)。

此命令适用于cmd.exe,但不适用于PS。这是怎么回事?什么是PS在解析CMD不执行的命令时所做的事情(反之亦然)?

亚伦

5 个答案:

答案 0 :(得分:7)

问题是PS出于某种原因以不同于cmd的方式解析-Dresourcepath=.。有效的是

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

这更符合我们的喜好。

虽然我希望你们没有这个,但我希望这篇文章可以帮助那些必须在Windows机器上部署java项目的人(即使他们不会在任何其他平台上运行)。

答案 1 :(得分:5)

从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

答案 2 :(得分:3)

基于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

答案 3 :(得分:1)

以下内容应该有效:

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

我想PowerShell会将类路径中的;解释为命令分隔符,从而尝试运行java -cp ../common.jar -D...

答案 4 :(得分:0)

start-process -nnw java "-cp .;./common.jar -Dcontext=atest1 -Dresourcepath=. DW_Install"