powershell运行java进程问题

Lim*_*ent 6 java powershell command-line

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

java.exe -cp .;./common.jar -Dcontext=atest1 -Dresourcepath=. DW_Install
Run Code Online (Sandbox Code Playgroud)

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

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

亚伦

Lim*_*ent 7

问题是PS由于某种原因-Dresourcepath=.与cmd 解析不同.有效的是

java -cp '.;.\common.jar' -Dcontext=atest1 "-Dresourcepath=." DW_Install
Run Code Online (Sandbox Code Playgroud)

斜杠的方式无关紧要,并且使用哪个引号('")并不重要.但是,类路径必须使用某种引号进行转义.一个很好的测试,看看PS解释器得到的是回应它.下列:

echo java -cp '.;.\common.jar' -Dcontext=atest1 -Dresourcepath=. DW_Install
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

java
-cp
.;.\common.jar
-Dcontext=etaste1
-Dresourcepath=
.
DW_Install
Run Code Online (Sandbox Code Playgroud)

(注意资源路径和资源路径的值不在同一行.)而输出到

echo java -cp '.;.\common.jar' -Dcontext=atest1 '-Dresourcepath=.' DW_Install
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

java
-cp
.;.\common.jar
-Dcontext=etaste1
-Dresourcepath=.
DW_Install
Run Code Online (Sandbox Code Playgroud)

这更符合我们的喜好.

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


Max*_*lle 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
Run Code Online (Sandbox Code Playgroud)