Jak znaleźć wersję systemu Windows z wiersza poleceń programu PowerShell

144

Jak sprawdzić, której wersji systemu Windows używam?

Używam PowerShell 2.0 i próbowałem:

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

Jak mam to zrobic?

jrara
źródło
5
Jeśli przeglądasz to w roku 2019+, zignoruj ​​odpowiedź oznaczoną jako poprawną i przejdź od razu do tej, która jest poprawna . Nie ma za co.
BrainSlugs83

Odpowiedzi:

195

Ponieważ masz dostęp do biblioteki .NET, możesz uzyskać dostęp do OSVersionwłaściwości System.Environmentklasy, aby uzyskać te informacje. Numer wersji zawiera Versionwłaściwość.

Na przykład,

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

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

Szczegóły dotyczące wersji systemu Windows można znaleźć tutaj .

Jeff Mercado
źródło
4
Zauważ, że [Environment]::OSVersiondziała w OSVersion.Version.Major
systemie
4
Po uruchomieniu winverpokazuje mi wersję 1607. Ale powyższa komenda PowerShell nie daje 1607. Gdzie znajdę ten numer „1607” w programie Powershell?
CMCDragonkai,
7
@CMCDragonkai(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId
Anton Krouglov
3
Ta metoda została wycofana w systemie Windows 8.1. Zobacz ten link, aby uzyskać szczegółowe informacje.
Slogmeister Extraordinaire
1
@SlogmeisterExtraordinaire Polecenie [System.Environment]::OSVersionnie jest przestarzałe, a metoda, z której korzysta w tle, jest przestarzała. Nowe wersje PS zmieniają zachowanie backendu: github.com/PowerShell/PowerShell/issues/ ...
Randy
111
  1. Aby uzyskać numer wersji systemu Windows, jak zauważa Jeff w swojej odpowiedzi , użyj:

    [Environment]::OSVersion
    

    Warto zauważyć, że wynik jest typowy [System.Version], więc można sprawdzić, na przykład, Windows 7 / Windows Server 2008 R2 i nowsze za pomocą

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

    Jednak nie powie ci, czy jest to klient czy serwer Windows, ani nazwa wersji.

  2. Użyj Win32_OperatingSystemklasy WMI (zawsze pojedynczej instancji), na przykład:

    (Get-WmiObject -class Win32_OperatingSystem).Caption
    

    zwróci coś takiego

    Microsoft® Windows Server® 2008 Standard

Richard
źródło
Ostrzeżenie dotyczące Get-WmiObject: czasami powrót zajmuje kilka sekund
ndemou
71

Niestety większość pozostałych odpowiedzi nie zawiera informacji dotyczących systemu Windows 10.

Windows 10 ma własne wersje : 1507, 1511, 1607, 1703 itd . Oto, co winverwidać.

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

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

Zobacz także powiązane pytanie dotyczące superużytkownika .

Podobnie jak w przypadku innych wersji systemu Windows, użyj systeminfo. Opakowanie PowerShell:

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]:...

Dane wyjściowe systemu Windows 10 dla tego samego polecenia:

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
Anton Krouglov
źródło
3
Jest to łatwe do zapamiętania winverna komputerze stacjonarnym i systeminfo serwerze. Od lat wprawia mnie w zakłopotanie, że nie ma jednolitego sposobu uzyskania tych informacji.
MortenB
2
Świetne linki do informacji MS, które są rzeczywiście przydatne. Należy zauważyć, że dla Win8.1 (i?) Poniżej pokazany informacji jest: OS Version : 6.3.9600 N/A Build 9600. Tak więc w wersjach poniżej W81 może być bardziej pouczające przyjrzenie się (zawsze pomijanym) wersjom LTSB. Zobacz wyjście z: (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabExco może wyglądać następująco: 9600.19179.amd64fre.winblue_ltsb_escrow.181015-1847. Moje przypuszczenie jest to, że 181015jest to data budowy, podczas gdy 1847jest budowa lub wydanie wersji. Być może będziesz musiał porównać to z kernelem, hal .
not2qubit
Powinna być akceptowana odpowiedź w 2020 roku. Hej SO Team, czy możemy zmieniać zaakceptowaną odpowiedź na przestrzeni lat? Czy to byłby metaproblem?
Timo
26
Get-WmiObject -Class Win32_OperatingSystem | ForEach-Object -MemberName Caption

Albo grał w golfa

gwmi win32_operatingsystem | % caption

Wynik

Microsoft Windows 7 Ultimate
Steven Penny
źródło
4
W nowym kodzie zaleca się użycie Get-CimInstance zamiast Get-WmiObject.
Der_Meister
2
@Der_Meister Dotyczy to tylko PSv3 +
Maximilian Burszley,
22
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

zwroty

WindowsProductName    WindowsVersion OsHardwareAbstractionLayer
------------------    -------------- --------------------------
Windows 10 Enterprise 1709           10.0.16299.371 
Lars Fosdal
źródło
@ not2qubit Naprawdę? Około 1 sekundy na moim Surface Book 2.
Eric Herlitz
21

W ten sposób otrzymasz pełną wersję systemu Windows (w tym numer wersji / kompilacji) w przeciwieństwie do wszystkich powyższych rozwiązań:

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

Wynik:

10.0.10240.16392 (th1_st1.150716-1608)
Ihor Zenich
źródło
5
To najlepsze rozwiązanie, o ile mi wiadomo, ponieważ poprawnie zgłasza numer rewizji. Żaden z pozostałych nie jest (przynajmniej tak, jak je testowałem).
BStateham,
7
To jedyne jak dotąd rozwiązanie, które pozwoliło mi uzyskać pełny numer kompilacji. Jednak nie wszystkie pliki w system32 są aktualizowane przy każdej aktualizacji - na przykład mój hal.dll nadal jest wyświetlany 10.0.10586.0 (th2_release.151029-1700), podczas gdy winload.exe ma 10.0.10586.63 (th2_release.160104-1513).
melak47
2
Oto mały skrypt, który pobiera wersję z dll / exe z najwyższą datą kompilacji: gist
melak47
6
Opiera się to na szczegółach implementacji po stronie Microsoftu, co do których nie ma gwarancji, że będą nadal działać. Teraz działa, ale powinieneś unikać polegania na tym, jeśli chcesz, aby Twój skrypt działał w dłuższej perspektywie.
Nick
1
@Jaykul Cóż, nie zgadzam się z 2 powodów. (1) ponieważ te liczby w stylu "1803" nie zawsze są dostępne (np. Na Win8), więc czego tam użyć? (2) Nie ma żadnego technicznego powodu, dla którego miałby być tylko jeden poprawny version. System operacyjny jest budowany (i aktualizowany) z części, tj. Jądra, warstwy HAL, UBR i funkcji itp. Zatem powinniśmy naprawdę wyświetlić je wszystkie. Pod tym względem myślę BuildLabEx, Kerneli HAL(w tej kolejności) byłby najbardziej odpowiedni sposób, aby dać bardziej właściwą wersję . Ale ponieważ wydaje się, że wiesz, co jest nie tak , powinieneś opublikować to, co jest dobre .
not2qubit
14

Od PowerShell 5:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

Myślę, że to polecenie prawie próbuje 1001 różnych odkrytych do tej pory sposobów zbierania informacji o systemie ...

Schadowy
źródło
Część odpowiedzi, jaką otrzymałem, jest dziwna ... Używam Windows 10 1909, ale „WindowsCurrentVersion” to 6.3. Myślę, że będzie to 10, ponieważ 6.3 to Windows 8.1. W przeciwnym razie podoba mi się informacja dostarczona przez to polecenie
Randy
8

Jeśli chcesz odróżnić Windows 8.1 (6.3.9600) i Windows 8 (6.2.9200), użyj

(Get-CimInstance Win32_OperatingSystem).Version 

aby uzyskać odpowiednią wersję. [Environment]::OSVersionnie działa poprawnie w Windows 8.1 (zwraca wersję Windows 8).

MoonStom
źródło
Zauważ, że [Environment]::OSVersiondziała w OSVersion.Version.Major
systemie
1
Oba (Get-CimInstance Win32_OperatingSystem).Versioni [Environment]::OSVersiondziałają dla mnie i zwracają ten sam wynik: 6.3.9600.0
VirtualVDX
niestety 6.3.9600 to nie tylko Win 8.1, serwer 2012 R2 również zwraca ten sam numer kompilacji.
bytejunkie
8

Doprecyzowuję jedną z odpowiedzi

Dotarłem do tego pytania, próbując dopasować dane wyjściowe z winver.exe:

Version 1607 (OS Build 14393.351)

Udało mi się wyodrębnić ciąg kompilacji za pomocą:

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

Wynik: 14393.351

Zaktualizowano : Oto nieco uproszczony skrypt używający wyrażenia regularnego

(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabEx -match '^[0-9]+\.[0-9]+' |  % { $matches.Values }
Taryfy
źródło
6

Wziąłem powyższe skrypty i trochę je poprawiłem, aby wymyślić to:

$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

Aby uzyskać taki wynik:

Microsoft Windows 10 Home 64-bit Wersja: 1709 Kompilacja: 16299.431 @ {WindowsInstallDateFromRegistry = 18-01-01 2:29:11 AM}

Wskazówka: byłbym wdzięczny za ręczne usunięcie tekstu prefiksu z daty instalacji, abym mógł zastąpić go bardziej czytelnym nagłówkiem.

Ron MVP
źródło
Uruchomienie polecenia daty instalacji zajmuje trochę czasu, więc znalazłem szybsze: [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970')).AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate) jest trochę bardziej złożone, ale działa o wiele szybciej. Możesz nawet pominąć część dotyczącą strefy czasowej:([datetime]'1/1/1970').AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate)
Randy
4

Jak mówi MoonStom, [Environment]::OSVersionnie działa poprawnie na zaktualizowanym Windows 8.1 (zwraca wersję Windows 8): link .

Jeśli chcesz odróżnić Windows 8.1 (6.3.9600) i Windows 8 (6.2.9200), możesz użyć, (Get-CimInstance Win32_OperatingSystem).Versionaby uzyskać odpowiednią wersję. Jednak to nie działa w PowerShell 2. Użyj tego:

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

Posługiwać się:

Get-WmiObject -class win32_operatingsystem -computer computername | Select-Object Caption
Prochowiec
źródło
Numer wersji można również uzyskać, używając tego: Get-WmiObject -class win32_operatingsystem | wybierz wersję
KERR
Możesz poprawić tę odpowiedź, pokazując wynik.
james.garriss
4

Jeśli próbujesz odszyfrować informacje, które MS umieszcza na swojej stronie z poprawkami, na przykład https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

będziesz potrzebować kombinacji, takiej jak:

$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-bitowy 1703

Michael Joyce
źródło
4

Aby wygenerować identyczne dane wyjściowe z winver.exe w programie PowerShell v5 w systemie Windows 10 1809:

$Version = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
"Version $($Version.ReleaseId) (OS Build $($Version.CurrentBuildNumber).$($Version.UBR))"
James Russell
źródło
Jest również zgodna z wersją w „Ustawienia> System> Informacje” w systemie Windows 10. I poprawnie aktualizuje wersję kompilacji, czego wiele rozwiązań nie ma na moim komputerze 👍
Vimes
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
}

Do wyświetlania (obie wersje):

"{0}  ({1})" -f $windows.Caption, $windows.Version 
Vince Ypma
źródło
1
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name BuildLabEx).BuildLabEx
Test
źródło
1

To naprawdę długi wątek i prawdopodobnie dlatego, że odpowiedzi, choć poprawne, nie rozwiązują podstawowego pytania. Trafiłem na tę stronę: Numery wersji i kompilacji, która zapewnia jasny przegląd tego, czym jest świat Microsoft Windows.

Ponieważ interesuje mnie wiedza, z którym dokładnie systemem operacyjnym Windows mam do czynienia, odłożyłem na bok całą tęczową wersję i skupiłem się na numerze kompilacji. Numer kompilacji można uzyskać przez:

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

lub przez:

(Get-CimInstance Win32_OperatingSystem).buildNumber

wybór należy do Ciebie, tak jak wolisz. Stamtąd mogłem zrobić coś w stylu:

    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

Uwaga: Jak widać, użyłem powyższego tylko dla systemów serwerowych, jednak można go łatwo zastosować na stacjach roboczych lub nawet sprytnie rozszerzyć, aby obsługiwał oba ... ale zostawię to tobie.

Baw się dobrze!

Porky
źródło
0

W ten sposób otrzymasz pełną i PRAWIDŁOWĄ (ten sam numer wersji, który znajdziesz po uruchomieniu winver.exe) wersji systemu Windows (w tym numer wersji / kompilacji) ZDALNIE w przeciwieństwie do wszystkich innych rozwiązań (przetestowanych w systemie 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"
    }
}
PowerShellGirl
źródło
Wystąpił błąd podczas uruchamiania tego z `` localhost '' i przy użyciu rzeczywistej nazwy komputera (zwróconej przez `` nazwę hosta '') na moim hoście lokalnym - czy można dostosować to rozwiązanie, aby umożliwić pobieranie informacji z komputera lokalnego bez włączania usług itp.?
monojohnny
[xxxxxx] Połączenie z serwerem zdalnym xxxxxx nie powiodło się z następującym komunikatem o błędzie: Klient nie może połączyć się z miejscem docelowym określonym w żądaniu. Sprawdź, czy usługa w miejscu docelowym działa i akceptuje żądania. Zapoznaj się z dziennikami i dokumentacją usługi WS-Management uruchomionej w miejscu docelowym, najczęściej IIS lub WinRM. Jeśli miejscem docelowym jest usługa WinRM, uruchom w miejscu docelowym następujące polecenie, aby przeanalizować i skonfigurować usługę WinRM: „winrm quickconfig”. Aby uzyskać więcej informacji, [...]
monojohnny
Pracował dla mnie. Głosowano za. Byłby to doskonały skrypt, gdyby zawierał identyfikator wydania systemu Windows 10 - 1507, 1511, 1607 itd.
Anton Krouglov
0

Dużo szukałem, aby znaleźć dokładną wersję, ponieważ serwer WSUS pokazuje niewłaściwą wersję. Najlepiej jest uzyskać korektę z klucza rejestru UBR.

    $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
Ali
źródło
0

Korzystając z programu Windows Powershell, można uzyskać potrzebne dane w następujący sposób

Podpis:

(Get-WmiObject -class Win32_OperatingSystem).Caption

ReleaseId:

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

wersja:

(Get-CimInstance Win32_OperatingSystem).version
Dan Steve
źródło
0

[rozwiązany]

#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-----------------#
Najwyższy Nobel
źródło
Witamy w SO! Kiedy odpowiadasz na pytanie, spróbuj trochę wyjaśnić. W tym przypadku jest jeszcze 20 odpowiedzi, więc rozważ ujawnienie swoich zalet.
David García Bodego
0

Możesz również użyć czegoś takiego, sprawdzając OSVersion.Version.Major:

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"}
KERR
źródło
0

Powinno być takie proste:

Get-ComputerInfo  | select windowsversion
Pion
źródło
-3
$OSVersion = [Version](Get-ItemProperty -Path "$($Env:Windir)\System32\hal.dll" -ErrorAction SilentlyContinue).VersionInfo.FileVersion.Split()[0]

W systemie Windows 10 zwraca: 10.0.10586.420

Następnie możesz użyć zmiennej, aby uzyskać dostęp do właściwości w celu szczegółowego porównania

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

Ponadto możesz porównać wersje systemu operacyjnego, korzystając z poniższych

If ([Version]$OSVersion -ge [Version]"6.1")
   {
       #Do Something
   }
GraceSolutions
źródło
-3

Możesz użyć Pythona, aby uprościć rzeczy (działa na wszystkich wersjach systemu Windows i wszystkich innych platformach):

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
Ruben Kelevra
źródło
Pytanie brzmi „Jak znaleźć wersję systemu Windows z wiersza poleceń programu PowerShell ”. To nie jest tak naprawdę odpowiedź na to pytanie i powinieneś rozważyć jej usunięcie.
Alain O'Dea