我想从powershell运行一个jar文件。直到现在我能够找到这个:
Start-Process -FilePath java -ArgumentList '-jar Upload_Download.jar FilePickupPath= $pickuppath FileDownloadPath= $download' -PassThru -RedirectStandardError E:\stderr.txt
这有些不起作用。有什么建议?
答案 0 :(得分:7)
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
值。
要解决此问题,请使用双引号。
答案 1 :(得分:2)
传递参数通常是一个问题,所以我使用了一个数组
还可以通过使用参数展开来避免排长行。
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"
}
答案 2 :(得分:0)
我的问题有点不同,因为有两个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文件。