Powershell bitlocker检查

时间:2017-10-26 11:44:25

标签: powershell if-statement operator-precedence 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 个答案:

答案 0 :(得分:2)

让我们看看它实际上做了什么:

someIcon.setText(someText.setText("someOtherString"))
  • 如果您的powershell版本小于4,则Win版本相同 到os1,然后继续
  • 如果os2有值,则继续
  • 如果os3有值,则继续

这里的主题是Operator Precedence,具体来说,在评估一行代码时会发生什么,第二,第三等情况会发生什么。就像在代数数学中一样,在公式的一部分周围添加parens会改变你读取它的顺序。

所以,你可以乱用parens让你的逻辑工作:

if ($powershellversion -lt 4 -And $winver -eq $os1 -or $os2 -or $os3) { ... }

换句话说

  • 评估PS版本是否< 4(if($powershellversion -lt 4 -and ( ($winver -eq $os1) -or ($winver -eq $os2) -or ($winver -eq $os3) )) ),$powershellversion -lt 4
  • 评估winver是os1,os2还是os3:-and

或者,您可以通过将os变量放入数组中来重新排列逻辑,并查看( ($winver -eq $os1) -or ($winver -eq $os2) -or ($winver -eq $os3) )是否在其中:

$winver

编辑:或

if($powershellversion -lt 4 -and $winver -in ($os1, $os2, $os3)) { ... }

向后兼容v2.0。