【问题标题】:powershell run java process problempowershell运行java进程问题
【发布时间】:2017-12-23 13:50:48
【问题描述】:

我正在尝试在 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 不做的命令时做了什么(反之亦然)?

亚伦

【问题讨论】:

  • 当你说它在 Powershell 中不起作用时,实际上会发生什么?
  • 我得到了 java.exe 帮助输出,就好像我刚刚输入了 javajava -help

标签: java command-line powershell


【解决方案1】:

从 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

【讨论】:

  • 键入 . 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 使用输出。
  • (a) 仅当程序名称会触发另一种解析模式时才需要使用.7za.exe 是一个示例),但即便如此,您也应该使用& 而不是@987654331 @ 因为您不是点源外部程序。 (b) $env 变量将无法按预期工作。
  • 虽然您的回答非常好,并且解决了很多问题,1)它是矫枉过正,2)它并不完全准确。对于 1) 的证明,请参阅下面的答案。对于 2),(假设我将 $env 更改为 $en)我需要为每个 -D 参数使用不同的 PS 变量以使一切正常。这确实解决了我在下面提到的问题(resourcepath=. 的解析不正确),但这对我的口味来说太麻烦了……再想一想,不必每次都输入这些环境变量可能会有所帮助……再次感谢对于帖子,你得到我的投票。
【解决方案2】:

以下应该有效:

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

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

【讨论】:

  • 不,不工作,但很好的尝试。我已经找到答案了,往下看。
【解决方案3】:

问题是 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=atest1
-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 项目的人有所帮助(即使它们永远不会在任何其他平台上运行)。

【讨论】:

    【解决方案4】:

    另一个基于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
    

    【讨论】:

    • 感谢您的信息!这是一个有用的例子,得到了我的投票。
    【解决方案5】:
    start-process -nnw java "-cp .;./common.jar -Dcontext=atest1 -Dresourcepath=. DW_Install"
    

    【讨论】:

    • 感谢您迟到的答复!我不再有 Microsoft Windows,也没有我试图运行的项目,所以我无法验证它的有效性。
    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多