我编写了一个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"发布于 2015-07-17 15:55:01
您可以使用-like "*Java 7 Update 80*"进行筛选,这不仅仅是Java 7 Update 80 (例如Java 7 Update 80 (64-bit)),而是在决定是否启动安装程序时,检查返回的字符串是否为Java 7 Update 80。
照@兰登所说的做,并在$java之前检查If的值。您很可能也有类似的东西,但不仅仅是$java中的“Java7Update80”。
为了避免这种古怪的行为,你需要保持你的条件一致。要么使用-like "*Java 7 Update 80*"无处不在,要么在任何地方使用-eq "Java 7 Update 80",但不要将它们混合在一起。
您还可以利用PowerShell 将其他类型计算为布尔值。的方式。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条件,因为您的逻辑是二进制的(不是安装了,就是没有安装)。
发布于 2015-07-20 17:35:55
原来$java变量是错误的,埃里克也是对的。
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..."https://stackoverflow.com/questions/31478900
复制相似问题