2011-01-13 85 views
5

我试图在Windows XP中通过Powershell运行java进程。这里的命令:powershell运行java进程问题

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

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

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

亚伦

+2

当你说这不PowerShell的工作,实际上发生了什么? – DanielGibbs 2011-01-13 21:26:39

+0

我得到了java.exe帮助输出,就好像我只是键入了`java`或`java -help`。 – 2011-01-18 16:03:57

回答

7

问题是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 

(注意resourcepath和resourcepath的值不在同一直线上。),而输出到

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

产生以下输出:

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

这更符合我们的喜好。

虽然我希望对大家都不希望这篇文章能够帮助那些必须在Windows机器上部署Java项目的人(尽管他们不会在其他任何平台上运行)。

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 
+0

打字`。 java.exe -cp。;。\ common.jar -Dcontext = atest1 -Dresourcepath =。 DW_Install`和`。 java.exe -cp“。;。\ common.jar”-Dcontext = atest1 -Dresourcepath =“。” DW_Install`和`。 java.exe -cp'。;。\ common.jar'-Dcontext = atest1 -Dresourcepath ='。' DW_Install`也不起作用。但是,我正在进入java.exe进程,因为有了第一个选项,我得到了java用法输出。 – 2011-01-14 16:06:23

+1

(a)如果程序的名称会触发另一个解析模式(`7za.exe`就是一个例子),只需要使用`.`,但即使如此,你也应该使用`&`而不是`.`,因为你不是点源外部程序。 (b)`$ env`变量不能按预期工作。 – Joey 2011-01-15 10:28:03

1

下面应该工作:

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

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

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