2015-07-17 3 views
0

Я написал сценарий PowerShell для проверки версии Java, и если он там не будет, он будет запускать установщик для него, но по какой-то причине, хотя он обнаруживает указанную версию Java, но он все еще запускает установщик.Автоматизация установки Java через Powershell

$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" 
+3

вы напечатали значение '$ java', чтобы проверить это? – Random

+1

FYI: не используйте для этого класс win32_product, если только вы не хотите создавать новые проблемы. Win32_product нарушен: когда вы запрашиваете этот класс, он заставляет восстанавливать все зарегистрированные msi, которые могут вызвать новые проблемы с приложениями, внезапно теряя свои настройки. Это также является причиной того, что этот класс работает так медленно (и он спамает журнал событий приложения). Циклирование через значения реестра для удаления является гораздо более быстрым и безопасным. Я также заметил опечатку в переключателе -filepath командлета start-process – bluuf

ответ

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 либо установлена, либо не установлена).

0

Так получилось, что переменная $ ява был неправ, и Эрик был прав

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..." 
Смежные вопросы