windows - Hvis erklæring for OS version

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg får ikke dette til arbejde, og er jeg virkelig forvirret, hvorfor den ikke virker. Min OS version er 10.0.14393, men den udskriver stadig, at den er lavere end 6? Hvad er der galt her?


$verCheckOS = (Get-WmiObject Win32\_OperatingSystem).Version

if ($verCheckOS -lt 6) {
    Write-Host -ForeGroundColor Red "Version is too low, $verCheckOS"
} else { 
    Write-Host -ForegroundColor Green "OS version is good, $verCheckOS"
}


Dette nedenfor med enkle tal fungerer godt, så jeg ved ikke, om OS-versionsnummeret er en bestemt type datatype? Hvordan sammenligner jeg OS versionsnummer med en if erklæring?


$value = 10

if ($value -lt 6) {
    Write-Host "Value is lower than 6"
} else {
    Write-Host "Value is greater than 6"
}

Bedste reference


Hvis du indtaster variablen $verCheckOS, vil der ske noget mere interessant:


[version]$verCheckOS = (Get-WmiObject win32\_operatingsystem).version


Når du kører koden, du har angivet, får vi en fejl:


if($verCheckOS -lt 6) { write-host -ForeGroundColor Red "Version is too low, $verCheckOS" }
Else { write-host -ForegroundColor Green "OS version is good, $verCheckOS" }

Could not compare "10.0.17134" to "6". Error: "Cannot convert value "6" to type "System.Version". 
Error: "Version string portion was too short or too long.""
At line:1 char:8


Hvad der sker her er variablen $verCheckOS er nu en [version] datatype, og det ensomme heltal 6 kan ikke konverteres til en [version] datatype. Det kræver mindst 2 oktetter at kunne konverteres, da [version] datatypen er repræsenteret som sådan:


Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      17134  -1      


Der er flere måder at håndtere dette afhængigt af hvilket nummer du prøver at sammenligne. Hvis du simpelthen søger at sammenligne 'Major' version octet, kan du sammenligne heltalene i modsætning til versionerne:


if($verCheckOS.Major -lt 6) { write-host -ForeGroundColor Red "Version is too low, $verCheckOS" }
Else { write-host -ForegroundColor Green "OS version is good, $verCheckOS" }


Dette vil returnere et positivt resultat ved at ekstrapolere 'Major' versionsnummer og gøre et helt tal til heltal sammenligning.


Hvis du vil sammenligne ægte 'versioner', så skal du give sammenligningen med 2 versionsobjekter, her er et eksempel:


[version]$verCheckOS = (Get-WmiObject win32\_operatingsystem).version
[version]$verCompare = "6.0"

if($verCheckOS -lt $verCompare) { write-host -ForeGroundColor Red "Version is too low, $verCheckOS" }
Else { write-host -ForegroundColor Green "OS version is good, $verCheckOS" }


For at se konverteringen fra streng til version sker i aktion eller for at prøve at analysere dine egne versionsnumre, skal du bruge [version] .NET-klassen som sådan:


[version]::new("6.0")

Andre referencer 1


(Get-WmiObject win32\_operatingsystem).version returnerer en streng (rør til Get-Member for at bekræfte), så $verCheckOS -lt 6 udfører leksikalsk sammenligning:


  PS> '10.0.14393' -lt 6  # *lexical* comparison; 6 is coerced to a string
  True # !! lexically, '1' comes before '6'


Casting til [version] giver dig mulighed for at udføre den påtænkte numeriske sammenligning baseret på egenskaben .Major:


 PS> $verCheckOS = [version] (Get-WmiObject win32\_operatingsystem).version
 PS> $verCheckOS.Major -lt 6  # 10 -lt 6 - numerical comparison
 False # OK


Adam Parsons nyttige svar viser, at det også er muligt at sammenligne to [version] tilfælde som helhed med -lt, hvilket giver mulighed for mere finkornet sammenligningslogik.