PowerShell komut satırından Windows sürümünü bulma


133

Hangi Windows sürümünü kullandığımı nasıl bulabilirim?

PowerShell 2.0 kullanıyorum ve denedim:

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

Bunu nasıl yaparım?


4
Eğer 2019+ bu görüntülüyorsanız, var cevabını görmezden işaretlenmiş doğru olarak ve düz gitmek biri olduğunu doğru . Rica ederim.
BrainSlugs83

Yanıtlar:


187

.NET kitaplığına erişiminiz olduğundan, bu bilgiyi almak OSVersioniçin System.Environmentsınıfın özelliğine erişebilirsiniz . Sürüm numarası için Versionözellik var.

Örneğin,

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

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

Windows sürümlerinin ayrıntılarını burada bulabilirsiniz .


4
Not [Environment]::OSVersionçalışır pencereler-10 , OSVersion.Version.Majordöner 10.
yzorg

4
Çalıştırdığımda winverbana 1607 sürümünü gösteriyor. Ama yukarıdaki powershell komutu 1607 vermiyor. Powershell'de bu "1607" numarasını nereden alabilirim?
CMCDragonkai

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

3
Bu yöntem Windows 8.1'den itibaren kullanımdan kaldırılmıştır. Ayrıntılar için bu bağlantıya bakın.
Slogmeister Extraordinaire

1
@SlogmeisterExtraordinaire Komut [System.Environment]::OSVersionkullanımdan kaldırılmadı, arka planda kullandığı yöntem kullanımdan kaldırıldı. Yeni PS sürümleri arka uç davranışını değiştiriyor: github.com/PowerShell/PowerShell/issues/…
Randy

110
  1. Jeff'in cevabında belirttiği gibi Windows sürüm numarasını almak için şunu kullanın:

    [Environment]::OSVersion

    Sonucun türden olduğuna dikkat etmek [System.Version]önemlidir, bu nedenle, örneğin Windows 7 / Windows Server 2008 R2 ve daha sonrasını kontrol etmek mümkündür.

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

    Ancak bu size bunun istemci veya sunucu Windows olup olmadığını veya sürümün adını söylemeyecektir.

  2. WMI Win32_OperatingSystemsınıfını kullanın (her zaman tek örnek), örneğin:

    (Get-WmiObject -class Win32_OperatingSystem).Caption

    gibi bir şey dönecek

    Microsoft® Windows Server® 2008 Standardı


62

Maalesef diğer yanıtların çoğu Windows 10'a özgü bilgiler sağlamıyor.

Windows 10'un kendi sürümleri vardır : 1507, 1511, 1607, 1703, vb . Gösteren budur winver.

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

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

Ayrıca süper kullanıcı ile ilgili soruya da bakınız .

Diğer Windows sürümlerinde olduğu gibi kullanın systeminfo. Powershell sarıcı:

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

Aynı komut için Windows 10 çıkışı:

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
Bunu winvermasaüstü ve systeminfo sunucuda hatırlamak kolaydır . Yıllardır bu bilgiyi elde etmenin tek tip bir yolu olmaması beni şaşırttı.
MortenB

2
MS bilgilerine gerçekten yararlı olan harika bağlantılar. O (? Aşağıda ve) Win8.1 için gösterilen bilgiler olduğuna dikkat edilmelidir: OS Version : 6.3.9600 N/A Build 9600. Bu nedenle, W81'in altındaki sürümlerde, (her zaman gözden kaçan) LTSB sürümlerine bakmak daha bilgilendirici olabilir. Çıktı bakınız: (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabExgibi görünebilir ki: 9600.19179.amd64fre.winblue_ltsb_escrow.181015-1847. Benim tahminim , 181015parçanın yapım tarihi, oysa 1847yapım veya yayın sürümü olduğu. Bunu ayrıca kernel ile karşılaştırmanız gerekebilir , hal .
not2qubit

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

Veya golf oynadı

gwmi win32_operatingsystem | % caption

Sonuç

Microsoft Windows 7 Ultimate

4
Yeni kodda Get-WmiObject yerine Get-CimInstance kullanılması önerilir.
Der_Meister

2
@Der_Meister Bu yalnızca PSv3 + için geçerli
Maximilian Burszley

20

Bu size, yukarıdaki tüm çözümlerin aksine Windows'un tam sürümünü (Revizyon / Derleme numarası dahil) verecektir :

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

Sonuç:

10.0.10240.16392 (th1_st1.150716-1608)

5
Revizyon numarasını doğru bir şekilde bildirdiği için endişelendiğim kadarıyla en iyi çözüm bu. Diğerlerinin hiçbiri değil (en azından onları test ettiğim gibi).
BStateham

6
Şu ana kadar tam yapı numarasını almamı sağlayan tek çözüm budur. Ancak , system32'deki tüm dosyalar her güncellemede güncellenmez - örneğin, hal.dll 10.0.10586.0 (th2_release.151029-1700)dosyam hala gösteriliyor , winload.exe ise 10.0.10586.63 (th2_release.160104-1513).
melak47

2
İşte gelen sürümünü alır biraz senaryo dll / exe en yüksek inşa tarihi ile: özü
melak47

6
Bu, Microsoft tarafında yapmaya devam edeceklerinin hiçbir garantisi olmayan bir uygulama ayrıntısına dayanmaktadır. Şimdi çalışıyor, ancak betiğinizin uzun vadede çalışmasını istiyorsanız buna güvenmekten kaçınmalısınız.
Nick

1
@Jaykul 2 sebepten dolayı katılmıyorum. (1) "1803" benzeri numaralar her zaman mevcut olmadığından (örneğin Win8'de), o halde orada ne kullanılmalı? (2) Tek bir doğru olması için teknik bir neden yoktur version. İşletim sistemi parçalar, yani Kernel, HAL, UBR ve özellikler vb. Tarafından oluşturulur (ve güncellenir) . O zaman gerçekten hepsini göstermeliyiz. Bence bağlamda BuildLabEx, Kernelve HAL(bu sırayla) daha doğru vermek en uygun yol olacaktır versiyonu . Ancak neyin yanlış olduğunu bildiğinize göre , doğru olanı göndermelisiniz .
not2qubit

19
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

İadeler

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

@ not2qubit Gerçekten mi? Yüzey Kitabı 2'de yaklaşık 1 saniye
Eric Herlitz

14

PowerShell 5'ten beri:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

Sanırım bu komut, sistem bilgilerini toplamak için şimdiye kadar keşfedilen 1001 farklı yolu deniyor ...


Bundan aldığım yanıtın bir kısmı garip ... Windows 10 1909 kullanıyorum, ancak "WindowsCurrentVersion" 6.3. 6.3'ün Windows 8.1 olduğu için bunun 10 olacağını düşünürdüm. Aksi takdirde, bu komutla sağlanan bilgileri
Randy

8

Windows 8.1 (6.3.9600) ile Windows 8 (6.2.9200) arasında ayrım yapmak istiyorsanız

(Get-CimInstance Win32_OperatingSystem).Version 

uygun sürümü almak için. [Environment]::OSVersionWindows 8.1'de düzgün çalışmaz (Windows 8 sürümünü döndürür).


Not [Environment]::OSVersionçalışır pencereler-10 , OSVersion.Version.Majordöner 10.
yzorg

1
Her ikisi de (Get-CimInstance Win32_OperatingSystem).Version ve [Environment]::OSVersionbenim için çalışıyor ve aynı sonuç: 6.3.9600.0
VirtualVDX

ne yazık ki 6.3.9600 sadece Win 8.1 değil, sunucu 2012 R2 de aynı yapı numarasını döndürüyor.
bytejunkie

8

Cevaplardan birini geliştiriyorum

Winver.exe'nin çıktısını eşleştirmeye çalışırken bu soruya ulaştım:

Version 1607 (OS Build 14393.351)

Derleme dizesini şu şekilde çıkarabildim:

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

Sonuç: 14393.351

Güncellendi : Burada regex kullanan biraz basitleştirilmiş bir komut dosyası var

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

5

Yukarıdaki senaryoları aldım ve bunu bulmak için biraz değiştirdim:

$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

Bunun gibi bir sonuç almak için:

Microsoft Windows 10 Home 64-bit Sürüm: 1709 Yapı: 16299.431 @ {WindowsInstallDateFromRegistry = 18-01-01 2:29:11 AM}

İpucu: Önek metnini yükleme tarihinden çıkaran bir elden memnun olurum, böylece onu daha okunabilir bir başlıkla değiştirebilirim.


Yükleme tarihi komutunun çalışması biraz zaman alıyor, bu yüzden daha hızlı bir tane buldum: [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970')).AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate) Biraz daha karmaşık, ancak çok daha hızlı çalışıyor. Hatta saat dilimi bölümünü bile dışarıda bırakabilirsiniz:([datetime]'1/1/1970').AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate)
Randy

4

MoonStom'un dediği gibi, [Environment]::OSVersionyükseltilmiş bir Windows 8.1'de düzgün çalışmıyor (Windows 8 sürümünü döndürüyor): bağlantı .

Windows 8.1 (6.3.9600) ile Windows 8 (6.2.9200) arasında ayrım (Get-CimInstance Win32_OperatingSystem).Versionyapmak istiyorsanız, uygun sürümü almak için kullanabilirsiniz . Ancak bu PowerShell 2'de çalışmaz. Bu yüzden şunu kullanın:

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

4

kullanın:

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

Bunu kullanarak sürüm numarasını da alabilir: Get-WmiObject -class win32_operatingsystem | Sürüm seçin
KERR

Çıktıyı göstererek bu yanıtı geliştirebilirsiniz.
james.garriss

4

MS'in https://technet.microsoft.com/en-us/library/security/ms17-010.aspx gibi yama sitelerine koyduğu bilgileri deşifre etmeye çalışıyorsanız

aşağıdaki gibi bir kombinasyona ihtiyacınız olacak:

$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
}

Ekran için (her iki versiyon):

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

2

Windows 10 1809'da PowerShell v5'te winver.exe ile aynı çıktıyı üretmek için:

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

Ayrıca, Windows 10'daki "Ayarlar> Sistem> Hakkında" bölümündeki sürümle eşleşir ve birçok çözümün makinemde olmadığı Güncelleme Derleme Revizyonunu doğru alır 👍
Vimes

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

1

Bu gerçekten uzun bir iş parçacığı ve muhtemelen cevaplar doğru olsa da temel soruyu çözmediğinden. Bu siteye rastladım: Sürüm ve Yapı Numaraları Microsoft Windows dünyasında ne olduğuna dair net bir genel bakış sağlayan .

İlgilendiğim tam olarak hangi Windows işletim sistemi ile uğraştığımı bilmek olduğundan, gökkuşağı versiyonunun tamamını bir kenara bıraktım ve bunun yerine BuildNumber'a odaklandım. Yapı numarası şu şekilde elde edilebilir:

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

veya tarafından:

(Get-CimInstance Win32_OperatingSystem).buildNumber

hangi yolu tercih ederseniz edin seçim sizindir. Böylece oradan şu çizgide bir şeyler yapabilirim:

    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

Not: Gördüğünüz gibi yukarıdakileri sadece sunucu sistemleri için kullandım, ancak iş istasyonlarına kolayca uygulanabilir veya her ikisini de desteklemek için akıllıca genişletilebilir ... ama bunu size bırakacağım.

Eğlenmenin tadını çıkar!


0

Bu size, Windows'un tam ve DOĞRU (winver.exe'yi çalıştırdığınızda bulduğunuz sürüm numarasıyla aynı) sürümünü (revizyon / yapı numarası dahil) diğer tüm çözümlerin aksine (Windows 10'da test edilmiştir) UZAKTAN verecektir:

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"
    }
}

Bunu 'localhost' ile çalıştırırken ve localhost'umda gerçek bilgisayar adını ('hostname' ile döndürüldüğü gibi) kullanırken hata aldım - hizmetleri etkinleştirmeden yerel bir makineden bilgi almasına izin vermek için bu çözümü değiştirmek mümkün mü?
monojohnny

[xxxxxx] xxxxxx uzak sunucuya bağlanma aşağıdaki hata mesajıyla başarısız oldu: İstemci, istekte belirtilen hedefe bağlanamıyor. Hedefteki hizmetin çalıştığını ve istekleri kabul ettiğini doğrulayın. Hedefte, en yaygın olarak IIS veya WinRM olmak üzere çalışan WS-Management hizmetinin günlüklerine ve belgelerine bakın. Hedef WinRM hizmetiyse, WinRM hizmetini analiz etmek ve yapılandırmak için hedefte şu komutu çalıştırın: "winrm quickconfig". Daha fazla bilgi için, [...]
monojohnny

Benim için çalıştı. Upvoted. Windows 10 sürüm kimliği - 1507, 1511, 1607 vb.
Anton Krouglov

0

Tam sürümü bulmak için çok araştırdım çünkü WSUS sunucusu yanlış sürümü gösteriyor. En iyisi, UBR kayıt defteri KEY'den revizyon almaktır.

    $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

Windows Powershell kullanarak, ihtiyacınız olan verileri aşağıdaki şekilde elde etmeniz mümkündür

Altyazı:

(Get-WmiObject -class Win32_OperatingSystem).Caption

ReleaseId:

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

versiyon:

(Get-CimInstance Win32_OperatingSystem).version

0

[Çözüldü]

#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-----------------#

SO'ya hoş geldiniz! Bir soruyu yanıtlarken lütfen biraz açıklamaya çalışın. Bu durumda, 20 yanıt daha var, bu nedenle Artılarınızı ortaya çıkarmayı düşünün.
David García Bodego

0

OSVersion.Version.Major'u kontrol ederek buna benzer bir şey de kullanabilirsiniz:

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

İşleri basitleştirmek için python kullanabilirsiniz (tüm Windows sürümlerinde ve diğer tüm platformlarda çalışır):

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

Soru, " PowerShell komut satırından Windows sürümünü nasıl bulabilirim " dir. Bu gerçekten bu sorunun cevabı değil ve silmeyi düşünmelisiniz.
Alain O'Dea

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

Windows 10'da şu değeri döndürür: 10.0.10586.420

Ardından, ayrıntılı karşılaştırma için özelliklere erişmek için değişkeni kullanabilirsiniz

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

Ek olarak, aşağıdakileri kullanarak işletim sistemi sürümlerini karşılaştırabilirsiniz.

If ([Version]$OSVersion -ge [Version]"6.1")
   {
       #Do Something
   }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.