powershell运行java进程问题

我试图在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不执行此命令时所做的事情(反之亦然)?

亚伦

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

这更符合我们的喜好。

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

从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 

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

以下应该有效:

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

我猜PowerShell解释了; 在classpath中作为命令分隔符,从而尝试运行java -cp ../common.jar -D...

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