So finden Sie die Windows-Version über die PowerShell-Befehlszeile


132

Wie finde ich die verwendete Windows-Version?

Ich verwende PowerShell 2.0 und habe versucht:

PS C:\> ver
The term 'ver' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify tha
t the path is correct and try again.
At line:1 char:4
+ ver <<<< 
    + CategoryInfo          : ObjectNotFound: (ver:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Wie mache ich das?


4
Wenn Sie in 2019+ sehen dies sind, ignorieren Sie die Antwort , die ist markiert als richtig und gehen direkt auf die eine , die ist richtig . Bitte.
BrainSlugs83

Antworten:


184

Da Sie Zugriff auf die .NET-Bibliothek haben, können Sie auf die OSVersionEigenschaft der System.EnvironmentKlasse zugreifen , um diese Informationen abzurufen. Für die Versionsnummer gibt es die VersionEigenschaft.

Beispielsweise,

PS C:\> [System.Environment]::OSVersion.Version

Major  Minor  Build  Revision
-----  -----  -----  --------
6      1      7601   65536

Details zu Windows-Versionen finden Sie hier .


4
Beachten Sie, dass [Environment]::OSVersionin Windows-10 funktioniert , OSVersion.Version.Majorgibt 10.
Yzorg

4
Wenn ich es ausführe winver, wird mir Version 1607 angezeigt. Der obige Powershell-Befehl gibt jedoch nicht 1607 an. Woher bekomme ich diese "1607" -Nummer in Powershell?
CMCDragonkai

6
@CMCDragonkai(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId
Anton Krouglov

3
Diese Methode war ab Windows 8.1 veraltet. Siehe diesen Link für Details.
Slogmeister Extraordinaire

1
@SlogmeisterExtraordinaire Der Befehl [System.Environment]::OSVersionwar nicht veraltet, die im Hintergrund verwendete Methode ist veraltet. Neue PS-Versionen ändern das Backend-Verhalten: github.com/PowerShell/PowerShell/issues/…
Randy

109
  1. Verwenden Sie Folgendes , um die Windows-Versionsnummer zu erhalten, wie Jeff in seiner Antwort feststellt :

    [Environment]::OSVersion

    Es ist erwähnenswert, dass das Ergebnis vom Typ ist [System.Version], sodass Sie beispielsweise nach Windows 7 / Windows Server 2008 R2 und höher mit suchen können

    [Environment]::OSVersion.Version -ge (new-object 'Version' 6,1)

    Dies sagt Ihnen jedoch weder, ob es sich um Client- oder Server-Windows handelt, noch den Namen der Version.

  2. Verwenden Sie die WMI- Win32_OperatingSystemKlasse (immer eine einzelne Instanz), zum Beispiel:

    (Get-WmiObject -class Win32_OperatingSystem).Caption

    wird so etwas wie zurückgeben

    Microsoft® Windows Server® 2008 Standard


61

Leider enthalten die meisten anderen Antworten keine spezifischen Informationen für Windows 10.

Windows 10 hat Versionen für sich: 1507, 1511, 1607, 1703, etc . Das winverzeigt es.

Powershell:
(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").ReleaseId

Command prompt (CMD.EXE):
Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ReleaseId

Siehe auch verwandte Frage zum Superuser .

Wie für andere Windows-Versionen verwenden systeminfo. Powershell Wrapper:

PS C:\> systeminfo /fo csv | ConvertFrom-Csv | select OS*, System*, Hotfix* | Format-List


OS Name             : Microsoft Windows 7 Enterprise
OS Version          : 6.1.7601 Service Pack 1 Build 7601
OS Manufacturer     : Microsoft Corporation
OS Configuration    : Standalone Workstation
OS Build Type       : Multiprocessor Free
System Type         : x64-based PC
System Locale       : ru;Russian
Hotfix(s)           : 274 Hotfix(s) Installed.,[01]: KB2849697,[02]: KB2849697,[03]:...

Windows 10-Ausgabe für denselben Befehl:

OS Name             : Microsoft Windows 10 Enterprise N 2016 LTSB
OS Version          : 10.0.14393 N/A Build 14393
OS Manufacturer     : Microsoft Corporation
OS Configuration    : Standalone Workstation
OS Build Type       : Multiprocessor Free
System Type         : x64-based PC
System Directory    : C:\Windows\system32
System Locale       : en-us;English (United States)
Hotfix(s)           : N/A

3
Dies ist winverauf dem Desktop und systeminfo auf dem Server leicht zu merken . Es hat mich jahrelang verblüfft, dass es keinen einheitlichen Weg gibt, diese Informationen zu erhalten.
MortenB

2
Tolle Links zu MS-Informationen, die eigentlich nützlich sind. Es ist zu beachten, dass für Win8.1 (und darunter?) Folgende Informationen angezeigt werden : OS Version : 6.3.9600 N/A Build 9600. In Versionen unter W81 kann es daher informativer sein, sich die (immer übersehenen) LTSB-Versionen anzusehen. Siehe Ausgabe von (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabEx:, die wie folgt aussehen kann : 9600.19179.amd64fre.winblue_ltsb_escrow.181015-1847. Ich vermute, dass der 181015Teil das Erstellungsdatum ist, während es sich um die 1847Erstellungs- oder Veröffentlichungsversion handelt. Möglicherweise müssen Sie dies auch mit Kernel, hal , vergleichen .
not2qubit

26
Get-WmiObject -Class Win32_OperatingSystem | ForEach-Object -MemberName Caption

Oder Golf gespielt

gwmi win32_operatingsystem | % caption

Ergebnis

Microsoft Windows 7 Ultimate

4
Es wird empfohlen, Get-CimInstance anstelle von Get-WmiObject in neuem Code zu verwenden.
Der_Meister

2
@Der_Meister Das gilt nur für PSv3 +
Maximilian Burszley

20

Dadurch erhalten Sie im Gegensatz zu allen oben genannten Lösungen die Vollversion von Windows (einschließlich der Revisions- / Build-Nummer) :

(Get-ItemProperty -Path c:\windows\system32\hal.dll).VersionInfo.FileVersion

Ergebnis:

10.0.10240.16392 (th1_st1.150716-1608)

5
Dies ist für mich die beste Lösung, da die Revisionsnummer korrekt gemeldet wird. Keiner der anderen ist es (zumindest so, wie ich sie getestet habe).
BStateham

6
Dies ist die einzige Lösung, die es mir bisher ermöglicht hat, die vollständige Build-Nummer zu erhalten. Es werden jedoch nicht alle Dateien in system32 mit jedem Update aktualisiert. Beispielsweise wird meine hal.dll weiterhin 10.0.10586.0 (th2_release.151029-1700)angezeigt, während winload.exe dies tut 10.0.10586.63 (th2_release.160104-1513).
Melak47

2
Hier ist ein kleines Skript, das die Version von der DLL / Exe mit dem höchsten Erstellungsdatum erhält: gist
melak47

6
Dies beruht auf einem Implementierungsdetail von Microsoft, für das keine Garantie besteht, dass dies auch weiterhin der Fall ist. Es funktioniert jetzt, aber Sie sollten es vermeiden, sich darauf zu verlassen, wenn Ihr Skript langfristig funktionieren soll.
Nick

1
@ Jaykul Nun, ich stimme aus 2 Gründen nicht zu. (1) Da diese "1803" -ähnlichen Nummern nicht immer verfügbar sind (z. B. unter Win8), was sollte dort verwendet werden? (2) Es gibt keinen technischen Grund, warum es nur einen richtigen geben sollte version. Das Betriebssystem wird von Teilen erstellt (und aktualisiert), dh dem Kernel, dem HAL, dem UBR und den Funktionen usw. Dann sollten wir wirklich alle anzeigen. In dieser Hinsicht denke ich BuildLabEx, Kernelund HAL(in dieser Reihenfolge) wäre der geeignetste Weg, um eine korrektere Version zu geben . Aber da Sie zu wissen scheinen, was falsch ist , sollten Sie posten, was richtig ist .
not2qubit

18
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

kehrt zurück

WindowsProductName    WindowsVersion OsHardwareAbstractionLayer
------------------    -------------- --------------------------
Windows 10 Enterprise 1709           10.0.16299.371 

@ not2qubit Wirklich? Ungefähr 1 Sek. Auf meinem Oberflächenbuch 2.
Eric Herlitz

14

Seit PowerShell 5:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

Ich denke, dieser Befehl versucht so ziemlich die 1001 verschiedenen Wege, die bisher entdeckt wurden, um Systeminformationen zu sammeln ...


Ein Teil der Antwort, die ich darauf erhielt, ist seltsam ... Ich bin unter Windows 10 1909, aber "WindowsCurrentVersion" ist 6.3. Ich würde denken, das wäre 10, da 6.3 Windows 8.1 ist. Ansonsten gefällt mir die Information, die durch diesen Befehl bereitgestellt wird
Randy

8

Wenn Sie zwischen Windows 8.1 (6.3.9600) und Windows 8 (6.2.9200) unterscheiden möchten, verwenden Sie

(Get-CimInstance Win32_OperatingSystem).Version 

um die richtige Version zu bekommen. [Environment]::OSVersionfunktioniert in Windows 8.1 nicht richtig (es wird eine Windows 8-Version zurückgegeben).


Beachten Sie, dass [Environment]::OSVersionin Windows-10 funktioniert , OSVersion.Version.Majorgibt 10.
Yzorg

1
Sowohl (Get-CimInstance Win32_OperatingSystem).Versionund [Environment]::OSVersionarbeitet für mich und schicken Sie das gleiche Ergebnis: 6.3.9600.0
VirtualVDX

Leider ist 6.3.9600 nicht nur Win 8.1, Server 2012 R2 gibt auch dieselbe Build-Nummer zurück.
Bytejunkie

8

Ich verfeinere eine der Antworten

Ich habe diese Frage erreicht, als ich versucht habe, die Ausgabe von winver.exe abzugleichen:

Version 1607 (OS Build 14393.351)

Ich konnte den Build-String extrahieren mit:

,((Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name BuildLabEx).BuildLabEx -split '\.') | % {  $_[0..1] -join '.' }  

Ergebnis: 14393.351

Aktualisiert : Hier ist ein leicht vereinfachtes Skript mit Regex

(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabEx -match '^[0-9]+\.[0-9]+' |  % { $matches.Values }

5

Ich habe die obigen Skripte genommen und sie ein wenig optimiert, um Folgendes zu finden:

$name=(Get-WmiObject Win32_OperatingSystem).caption
$bit=(Get-WmiObject Win32_OperatingSystem).OSArchitecture

$vert = " Version:"
$ver=(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").ReleaseId

$buildt = " Build:"
$build= (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabEx -match '^[0-9]+\.[0-9]+' |  % { $matches.Values }

$installd = Get-ComputerInfo -Property WindowsInstallDateFromRegistry

Write-host $installd
Write-Host $name, $bit, $vert, $ver, `enter code here`$buildt, $build, $installd

So erhalten Sie ein Ergebnis:

Microsoft Windows 10 Home 64-Bit-Version: 1709 Build: 16299.431 @ {WindowsInstallDateFromRegistry = 18-01-01 02:29:11 AM}

Hinweis: Ich würde es begrüßen, wenn eine Hand den Präfixtext vom Installationsdatum entfernt, damit ich ihn durch einen besser lesbaren Header ersetzen kann.


Der Befehl zum Installieren des Datums dauert eine Weile, daher habe ich einen schnelleren gefunden: [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970')).AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate) Er ist etwas komplexer, aber viel schneller. Möglicherweise können Sie sogar den Teil der Zeitzone weglassen:([datetime]'1/1/1970').AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate)
Randy

4

Wie MoonStom sagt, [Environment]::OSVersionfunktioniert es unter einem aktualisierten Windows 8.1 nicht richtig (es gibt eine Windows 8-Version zurück): link .

Wenn Sie zwischen Windows 8.1 (6.3.9600) und Windows 8 (6.2.9200) unterscheiden möchten, können (Get-CimInstance Win32_OperatingSystem).VersionSie die richtige Version verwenden. In PowerShell 2 funktioniert dies jedoch nicht. Verwenden Sie also Folgendes:

$version = $null
try {
    $version = (Get-CimInstance Win32_OperatingSystem).Version
}
catch {
    $version = [System.Environment]::OSVersion.Version | % {"{0}.{1}.{2}" -f $_.Major,$_.Minor,$_.Build}
}

4

Verwenden:

Get-WmiObject -class win32_operatingsystem -computer computername | Select-Object Caption

Sie können die Versionsnummer auch folgendermaßen abrufen: Get-WmiObject -class win32_operatingsystem |
Wählen

Sie können diese Antwort verbessern, indem Sie die Ausgabe anzeigen.
james.garriss

4

Wenn Sie versuchen, Informationen zu entschlüsseln, stellt MS eine Patch-Site wie https://technet.microsoft.com/en-us/library/security/ms17-010.aspx bereit

Sie benötigen eine Kombination wie:

$name=(Get-WmiObject Win32_OperatingSystem).caption $bit=(Get-WmiObject Win32_OperatingSystem).OSArchitecture $ver=(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").ReleaseId Write-Host $name, $bit, $ver

Microsoft Windows 10 Home 64-Bit 1703


2

Windows PowerShell 2.0:

$windows = New-Object -Type PSObject |
           Add-Member -MemberType NoteProperty -Name Caption -Value (Get-WmiObject -Class Win32_OperatingSystem).Caption -PassThru |
           Add-Member -MemberType NoteProperty -Name Version -Value [Environment]::OSVersion.Version                     -PassThru

Windows PowerShell 3.0:

$windows = [PSCustomObject]@{
    Caption = (Get-WmiObject -Class Win32_OperatingSystem).Caption
    Version = [Environment]::OSVersion.Version
}

Zur Anzeige (beide Versionen):

"{0}  ({1})" -f $windows.Caption, $windows.Version 

2

So erzeugen Sie eine identische Ausgabe wie winver.exe in PowerShell v5 unter Windows 10 1809:

$Version = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
"Version $($Version.ReleaseId) (OS Build $($Version.CurrentBuildNumber).$($Version.UBR))"

Außerdem stimmt es mit der Version unter "Einstellungen> System> Info" in Windows 10 überein.
Außerdem

1
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name BuildLabEx).BuildLabEx

1

Dies ist wirklich ein langer Thread, und wahrscheinlich, weil die richtigen Antworten die grundlegende Frage nicht lösen. Ich bin auf diese Site gestoßen : Versions- und Build-Nummern , die einen klaren Überblick über das, was in der Microsoft Windows-Welt ist, bieten.

Da ich wissen möchte, mit welchem ​​Windows-Betriebssystem ich es genau zu tun habe, habe ich die gesamte Version rainbow beiseite gelassen und mich stattdessen auf die BuildNumber konzentriert. Die Build-Nummer kann entweder erreicht werden durch:

([Environment]::OSVersion.Version).Build

oder von:

(Get-CimInstance Win32_OperatingSystem).buildNumber

Sie haben die Wahl, wie Sie es bevorzugen. Von dort aus konnte ich also Folgendes tun:

    switch ((Get-CimInstance Win32_OperatingSystem).BuildNumber) 
{
    6001 {$OS = "W2K8"}
    7600 {$OS = "W2K8R2"}
    7601 {$OS = "W2K8R2SP1"}    
    9200 {$OS = "W2K12"}
    9600 {$OS = "W2K12R2"}
    14393 {$OS = "W2K16v1607"}
    16229 {$OS = "W2K16v1709"}
    default { $OS = "Not Listed"}

}
Write-Host "Server system: $OS" -foregroundcolor Green

Hinweis: Wie Sie sehen, habe ich das oben Genannte nur für Serversysteme verwendet, es kann jedoch problemlos auf Workstations angewendet oder sogar geschickt erweitert werden, um beide zu unterstützen ... aber das überlasse ich Ihnen.

Habe Spaß!


0

Dadurch erhalten Sie die vollständige und RICHTIGE (dieselbe Versionsnummer, die Sie beim Ausführen von winver.exe finden) Windows-Version (einschließlich Revisions- / Build-Nummer) FERN im Gegensatz zu allen anderen Lösungen (getestet unter Windows 10):

Function Get-OSVersion {
Param($ComputerName)
    Invoke-Command -ComputerName $ComputerName -ScriptBlock {
        $all = @()
        (Get-Childitem c:\windows\system32) | ? Length | Foreach {

            $all += (Get-ItemProperty -Path $_.FullName).VersionInfo.Productversion
        }
        $version = [System.Environment]::OSVersion.Version
        $osversion = "$($version.major).0.$($version.build)"
        $minor = @()
        $all | ? {$_ -like "$osversion*"} | Foreach {
            $minor += [int]($_ -replace".*\.")
        }
        $minor = $minor | sort | Select -Last 1

        return "$osversion.$minor"
    }
}

Ich habe beim Ausführen dieses Fehlers mit 'localhost' und der Verwendung des tatsächlichen Computernamens (wie von 'hostname' zurückgegeben) auf meinem lokalen Host einen Fehler erhalten. Ist es möglich, diese Lösung zu optimieren, damit die Informationen von einem lokalen Computer abgerufen werden können, ohne Dienste usw. zu aktivieren?
Monojohnny

[xxxxxx] Die Verbindung zum Remote-Server xxxxxx ist mit der folgenden Fehlermeldung fehlgeschlagen: Der Client kann keine Verbindung zu dem in der Anforderung angegebenen Ziel herstellen. Stellen Sie sicher, dass der Dienst am Ziel ausgeführt wird und Anforderungen akzeptiert. Konsultieren Sie die Protokolle und Dokumentationen für den WS-Management-Dienst, der auf dem Ziel ausgeführt wird, am häufigsten IIS oder WinRM. Wenn das Ziel der WinRM-Dienst ist, führen Sie den folgenden Befehl auf dem Ziel aus, um den WinRM-Dienst zu analysieren und zu konfigurieren: "winrm quickconfig". Für weitere Informationen, [...]
Monojohnny

Hat für mich gearbeitet. Upvoted. Das wäre ein perfektes Skript, wenn es Windows 10 Release-ID enthalten würde - 1507, 1511, 1607 usw.
Anton Krouglov

0

Ich habe viel gesucht, um die genaue Version herauszufinden, da der WSUS-Server die falsche Version anzeigt. Am besten holen Sie sich eine Revision vom UBR-Registrierungsschlüssel.

    $WinVer = New-Object TypeName PSObject
$WinVer | Add-Member MemberType NoteProperty Name Major Value $(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion' CurrentMajorVersionNumber).CurrentMajorVersionNumber
$WinVer | Add-Member MemberType NoteProperty Name Minor Value $(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion' CurrentMinorVersionNumber).CurrentMinorVersionNumber
$WinVer | Add-Member MemberType NoteProperty Name Build Value $(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion' CurrentBuild).CurrentBuild
$WinVer | Add-Member MemberType NoteProperty Name Revision Value $(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion' UBR).UBR
$WinVer

0

Mit Windows Powershell können Sie die benötigten Daten auf folgende Weise abrufen

Bildbeschriftung:

(Get-WmiObject -class Win32_OperatingSystem).Caption

ReleaseId:

(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId

Ausführung:

(Get-CimInstance Win32_OperatingSystem).version

0

[gelöst]

#copy all the code below:
#save file as .ps1 run and see the magic

 Get-WmiObject -Class Win32_OperatingSystem | ForEach-Object -MemberName Caption
 (Get-CimInstance Win32_OperatingSystem).version


#-------------comment-------------#
#-----finding windows version-----#

$version= (Get-CimInstance Win32_OperatingSystem).version
$length= $version.Length
$index= $version.IndexOf(".")
[int]$windows= $version.Remove($index,$length-2)  
$windows
#-----------end------------------#
#-----------comment-----------------#

Willkommen bei SO! Wenn Sie eine Frage beantworten, versuchen Sie bitte, ein wenig zu erklären. In diesem Fall gibt es 20 weitere Antworten. Stellen Sie also Ihre Vorteile offen.
David García Bodego

0

Sie können auch so etwas verwenden, indem Sie OSVersion.Version.Major überprüfen:

IF ([System.Environment]::OSVersion.Version.Major -ge 10) {Write-Host "Windows 10 or above"}
IF ([System.Environment]::OSVersion.Version.Major -lt 10) {Write-Host "Windows 8.1 or below"}

-2

Sie können Python verwenden, um die Dinge zu vereinfachen (funktioniert auf allen Windows-Versionen und allen anderen Plattformen):

import platform

print(platform.system()) # returns 'Windows', 'Linux' etc.
print(platform.release()) # returns for Windows 10 or Server 2019 '10'

if platform.system() = 'Windows':
    print(platform.win32_ver()) # returns (10, 10.0.17744, SP0, Multiprocessor Free) on windows server 2019

Die Frage lautet "So finden Sie die Windows-Version über die PowerShell-Befehlszeile ". Dies ist keine wirkliche Antwort auf diese Frage, und Sie sollten in Betracht ziehen, sie zu löschen.
Alain O'Dea

-3
$OSVersion = [Version](Get-ItemProperty -Path "$($Env:Windir)\System32\hal.dll" -ErrorAction SilentlyContinue).VersionInfo.FileVersion.Split()[0]

Unter Windows 10 wird Folgendes zurückgegeben: 10.0.10586.420

Sie können dann die Variable verwenden, um auf Eigenschaften für einen detaillierten Vergleich zuzugreifen

$OSVersion.Major equals 10
$OSVersion.Minor equals 0
$OSVersion.Build equals 10586
$OSVersion.Revision equals 420

Darüber hinaus können Sie Betriebssystemversionen wie folgt vergleichen

If ([Version]$OSVersion -ge [Version]"6.1")
   {
       #Do Something
   }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.