Проверка Powershell BitLocker
Привет, у меня есть трудности, чтобы заставить мой сценарий работать: он продолжает давать сбой при первом выводе записи, даже когда версия powershell выше, чем 4
, Работает только когда убираю And $winver -eq $os1 -or $os2 -or $os3
,
В противном случае он продолжает говорить мне, что мою версию PowerShell необходимо обновить. Я нахожусь на V5 в настоящее время и $PSVersionTable.PSVersion.Major
говорит ли это 5
в самом деле. Что я делаю неправильно?
$winver = (Get-WmiObject -class Win32_OperatingSystem).Caption
$powershellversion = $PSVersionTable.PSVersion.Major
$os1 = "Microsoft Windows 7 Professional"
$os2 = "Microsoft Windows 10 Pro"
$os3 = "Microsoft Windows 10 Enterprise"
if($winver -ne ($os1, $os2, $os3) -contains $winver){
Write-Host "Bitlocker not supported on $winver"
Exit 0
}
if($powershellversion -lt 4){
Write-Host "Upgrade Powershell Version"
Exit 1010
}
else
{
$bitlockerkey = (Get-BitLockerVolume -MountPoint C).KeyProtector.RecoveryPassword
$pcsystemtype = (Get-WmiObject -Class Win32_ComputerSystem).PCSystemType
if ($pcsystemtype -eq "2"){
$setsystemtype = "Laptop"
}
else {
$setsystemtype = "Desktop"
}
if ($setsystemtype -eq "laptop" -And $bitlockerkey -eq $null -and ($os1, $os2, $os3) -contains $winver){
Write-Host "$setsystemtype without bitlocker"
Exit 1010
}
if ($setsystemtype -eq "desktop" -And $bitlockerkey -eq $null -and ($os1, $os2, $os3) -contains $winver){
Write-Host "$setsystemtype without bitlocker"
Exit 0
}
if ($winver -eq ($os1, $os2, $os3) -contains $winver){
Write-Host "$bitlockerkey"
Exit 0
}
}
1 ответ
Давайте посмотрим, что это на самом деле делает:
if ($powershellversion -lt 4 -And $winver -eq $os1 -or $os2 -or $os3) { ... }
- Если ваша версия powershell меньше 4, а версия Win равна os1, тогда продолжайте
- Если os2 имеет значение, тогда продолжайте
- Если у os3 есть значение, тогда продолжайте
Тема здесь - " Приоритет оператора", в частности, что происходит первым при оценке строки кода, что происходит вторым, третьим и так далее. Как и в математике алгебры, добавление слов вокруг части формулы меняет порядок, в котором вы ее читаете.
Таким образом, вы можете возиться с паренами, чтобы заставить вашу логику работать:
if($powershellversion -lt 4 -and ( ($winver -eq $os1) -or ($winver -eq $os2) -or ($winver -eq $os3) ))
Другими словами
- оценить, если версия PS <4 (
$powershellversion -lt 4
),-and
- оцените, является ли winver os1, os2 или os3:
( ($winver -eq $os1) -or ($winver -eq $os2) -or ($winver -eq $os3) )
,
Или вы можете немного изменить свою логику, поместив переменные os в массив и посмотрев, $winver
находится там:
if($powershellversion -lt 4 -and $winver -in ($os1, $os2, $os3)) { ... }
Редактор
if($powershellversion -lt 4 -and ($os1, $os2, $os3) -contains $winver) { ... }
для обратной совместимости с v2.0.