0

嗨,我很难让我的脚本正常工作:它在第一次写入输出时一直失败,即使 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
}
}
4

1 回答 1

2

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

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。

于 2017-10-26T11:58:59.323 回答