运行 来自 powershell 的 jar 文件

Run a jar file from powershell

我想从 powershell 运行 一个 jar 文件。到目前为止,我已经能够找到这个:

Start-Process -FilePath java -ArgumentList '-jar Upload_Download.jar FilePickupPath= $pickuppath FileDownloadPath= $download' -PassThru -RedirectStandardError E:\stderr.txt 

不知道这是怎么回事。有什么建议么?

Powershell 有多个行为不同的字符串引号字符。双引号 " 允许在字符串内进行计算,而单引号 ' 则不允许。

举个实际例子:

$foo=42
write-host "The foo: $foo"
# Prints The foo: 42
write-host 'The foo: $foo'
# Prints The foo: $foo

该命令像这样使用单引号,(反引号用于将代码拆分为屏幕友好格式)

Start-Process -FilePath java `
-ArgumentList '-jar Upload_Download.jar FilePickupPath= $pickuppath fileDownloadPath= $download' `
-PassThru -RedirectStandardError E:\stderr.txt 

这将逐字传递 $pickuppath$download。意图很可能通过$pickuppath$download

为了解决问题,请使用双引号。

我的问题有点不同,因为安装了两个 jre 版本和一个 jdk 并且 powershell 总是选择基于 jre 的 java 可执行文件并失败并显示消息

C:\Program Files\Java\jre1.8.0_73 is not a valid JDK Java Home.

尽管安装了 jdk 并设置了 JAVA_HOME 变量,但变量外的 jdk 路径正确显示。

> $env:JAVA_HOME
C:\Program Files\Java\jdk1.8.0_73

我将 jdk java 可执行文件路径存储在变量中,导航到包含 Web 逻辑服务器 jar 文件的目录,并使用以下代码调用安装程序。

 $java="C:\Program Files\Java\jdk1.8.0_73\bin\java"
 Start-Process -FilePath $java -ArgumentList '-jar fmw_12.2.1.3.0_infrastructure_generic.jar'

安装程序在几秒钟后打开。我省略了 -RedirectStandardErro 开关以保持命令小而简单,尽管我确实首先使用它来捕获任何错误。

我尝试使用变量 $fmw 来存储 jar 文件 fmw_12.2.1.3.0_infrastructure_generic.jar 但它没有用。不成功的代码如下

$fmw="fmw_12.2.1.3.0_infrastructure_generic.jar"
Start-Process -FilePath $java -ArgumentList '-jar $fmw'

我希望这会对某人有所帮助,并且有人可能会为我提供一种更好、更干净的方法来在 powershell 中调用 jar 文件。

传递参数通常是个问题,所以我使用数组,

也可以通过使用参数展开来避免长行。

if(-not $env:JAVA_HOME)
{
    Write-Error "JAVA_HOME not set"
    break
}

$params = @{
    FilePath = [string]::Format("{0}\bin\java.exe",$env:JAVA_HOME)
    WorkingDirectory = "D:\SDL\Web\live\discovery\config\"
    ArgumentList = @("-jar", "discovery-registration.jar", "update")
    RedirectStandardError = "c:\temp\JavaError.txt"
    PassThru = $true
    Wait = $true
}

$p = Start-Process @params

if($p.ExitCode -eq 0)
{
    Write-Output "Discovery Registration complete"
}
else
{
    Write-Output "Discovery Registration failed"
}

上面的代码还有一个问题。

$java="C:\Program Files (x86)\Minecraft Launcher\AdoptOpenJDK\jre-8.0.222.10-hotspot\bin\java.exe"
Start-Process -FilePath $java -ArgumentList '-jar "C:\Program Files (x86)\Minecraft Launcher\Mineshafter-launcher.jar"'

在这段代码中,我使用 java 运行 与 Minecraft Launcher 捆绑在一起的时间到 运行 Mineshafter。

当我尝试使用上面的答案时,脚本执行了但没有任何反应。这就是我将 .jar 文件的路径用双引号引起来的原因。在我这样做之后,jar 执行得非常好。此外,在定义 $java 变量时,将完整路径粘贴到 java.exe 文件,而不仅仅是文件夹。这很有帮助,因为 PowerShell 将简单地使用该可执行文件而不是搜索可执行文件。如果在同一个目录下安装了多个Java版本,PowerShell可能会选错