通过Powershell

时间:2015-07-17 15:04:39

标签: powershell

我已经编写了一个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"

2 个答案:

答案 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变量错了,Eri​​c也是对的

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..."