我已经编写了一个PowerShell脚本来检查Java版本,如果它不存在,它会为它运行安装程序,但由于某种原因,即使它检测到指定的Java版本,它仍然运行安装程序。
$java = Get-WmiObject -Class win32_product |
where {$_.Name -like "*Java 7 Update 80*"}
If ($java -eq 'Java 7 Update 80') {
"your java version is acceptable"
Exit
} ElseIf ($java -ne 'Java 7 Update 80') {
Start-Process -filepat C:\jre1.7.0_80.msi /passive
"You don't have the right version of Java, installing Java 7 Update 80"
}
Write-Host "End"
答案 0 :(得分:1)
您使用-like "*Java 7 Update 80*"
进行过滤,这将获得的不仅仅是Java 7 Update 80
(例如Java 7 Update 80 (64-bit)
),而是检查返回的字符串是否正好当您决定是否启动安装程序时,Java 7 Update 80
。
按@Random说,并在$java
之前检查If
的值。你很可能也有类似的东西,但不仅仅是" Java 7 Update 80"在$java
。
为了避免这种片状行为,您需要保持条件的一致性。可以在任何地方使用-like "*Java 7 Update 80*"
,也可以在任何地方使用-eq "Java 7 Update 80"
,但不要混用它们。
您还可以使用PowerShell evaluates other types to boolean的方式。您的Get-WmiObject
语句生成$null
(评估为$false
)或非空字符串(评估为$true
),因此您可以执行以下操作以避免多次执行相同的检查:
if ($java) {
"your java version is acceptable"
Exit
} else {
Start-Process -filepat C:\jre1.7.0_80.msi /passive
"You don't have the right version of Java, installing Java 7 Update 80"
}
无论如何你都不需要elseif
条件,因为你的逻辑是二进制的(Java已安装或未安装)。
答案 1 :(得分:0)
原来,$ java变量错了,Eric也是对的
Start-Process powershell -Verb runAs
$java = Get-WmiObject -Class win32_product | where { $_.Name -like "*Java 7 Update 71*"}
If ($java){"your java version is acceptable"}
Else {Start-Process "C:\jre-7u71-windows-i586.exe" -Verb runAs -ArgumentList "/s" -Wait
"You don't have the right version of Java, installing Java 7 Update 71"
}
Write-Host "Press any key to exit..."