Cara menemukan versi Windows dari baris perintah PowerShell

133

Bagaimana cara menemukan versi Windows yang saya gunakan?

Saya menggunakan PowerShell 2.0 dan mencoba:

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

Bagaimana saya melakukan ini?

jrara
sumber
4
Jika Anda melihat ini dalam 2019+, mengabaikan jawaban yang ditandai sebagai benar dan langsung pergi ke salah satu yang adalah benar . Sama-sama.
BrainSlugs83

Jawaban:

186

Karena Anda memiliki akses ke perpustakaan .NET, Anda bisa mengakses OSVersionproperti System.Environmentkelas untuk mendapatkan informasi ini. Untuk nomor versi, ada Versionproperti.

Sebagai contoh,

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

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

Detail versi Windows dapat ditemukan di sini .

Jeff Mercado
sumber
4
Perhatikan bahwa [Environment]::OSVersionbekerja di windows-10 , OSVersion.Version.Majormengembalikan 10.
yzorg
4
Ketika saya menjalankannya winvermenunjukkan kepada saya versi 1607. Tetapi perintah powershell di atas tidak memberikan 1607. Di mana saya mendapatkan nomor "1607" ini di Powershell?
CMCDragonkai
6
@CMCDragonkai(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId
Anton Krouglov
3
Metode ini sudah usang pada Windows 8.1. Lihat tautan ini untuk detailnya.
Slogmeister Extraordinaire
1
@ LogmeisterExtraordinaire Perintah [System.Environment]::OSVersionitu tidak ditinggalkan, metode yang digunakan di latar belakang telah ditinggalkan. Versi PS baru mengubah perilaku backend: github.com/PowerShell/PowerShell/issues/…
Randy
109
  1. Untuk mendapatkan nomor versi Windows, seperti yang dicatat Jeff dalam jawabannya , gunakan:

    [Environment]::OSVersion

    Perlu dicatat bahwa hasilnya adalah tipe [System.Version], sehingga dimungkinkan untuk memeriksa, katakanlah, Windows 7 / Windows Server 2008 R2 dan kemudian dengan

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

    Namun ini tidak akan memberi tahu Anda apakah itu klien atau server Windows, atau nama versi.

  2. Gunakan Win32_OperatingSystemkelas WMI (selalu instance tunggal), misalnya:

    (Get-WmiObject -class Win32_OperatingSystem).Caption

    akan mengembalikan sesuatu seperti

    Microsoft® Windows Server® 2008 Standard

Richard
sumber
61

Sayangnya sebagian besar jawaban lain tidak memberikan informasi khusus untuk Windows 10.

Windows 10 memiliki versi sendiri: 1507, 1511, 1607, 1703, dll . Inilah yang winverditunjukkan.

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

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

Lihat juga pertanyaan terkait pada superuser .

Adapun penggunaan versi Windows lainnya systeminfo. Pembungkus 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]:...

Output Windows 10 untuk perintah yang sama:

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
sumber
3
Ini mudah diingat winverdi desktop dan systeminfo di server. Sudah membingungkan saya selama bertahun-tahun bahwa tidak ada cara seragam untuk mendapatkan info ini.
MortenB
2
Tautan hebat ke info MS yang sebenarnya berguna. Perlu dicatat bahwa untuk Win8.1 (dan di bawah?) Info yang ditampilkan adalah: OS Version : 6.3.9600 N/A Build 9600. Jadi dalam versi di bawah W81, mungkin lebih informatif untuk melihat versi LTSB (selalu diabaikan). Melihat output dari: (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabExyang mungkin terlihat seperti: 9600.19179.amd64fre.winblue_ltsb_escrow.181015-1847. Dugaan saya adalah bahwa 181015bagian tersebut adalah tanggal pembuatan, sedangkan versi 1847adalah versi bangun atau rilis. Anda mungkin juga perlu membandingkan ini dengan kernel, hal .
not2qubit
26
Get-WmiObject -Class Win32_OperatingSystem | ForEach-Object -MemberName Caption

Atau bermain golf

gwmi win32_operatingsystem | % caption

Hasil

Microsoft Windows 7 Ultimate
Steven Penny
sumber
4
Disarankan untuk menggunakan Get-CimInstance alih-alih Get-WmiObject dalam kode baru.
Der_Meister
2
@Der_Meister Itu hanya berlaku untuk PSv3 +
Maximilian Burszley
20

Ini akan memberi Anda versi lengkap Windows (termasuk nomor Revisi / Bangun) tidak seperti semua solusi di atas:

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

Hasil:

10.0.10240.16392 (th1_st1.150716-1608)
Ihor Zenich
sumber
5
Ini adalah solusi terbaik sejauh yang saya ketahui karena melaporkan nomor revisi dengan benar. Tidak ada yang lain (setidaknya seperti yang saya uji).
BStateham
6
Ini adalah satu-satunya solusi sejauh ini yang memungkinkan saya mendapatkan nomor build lengkap. Namun , tidak semua file di system32 diperbarui dengan setiap pembaruan - misalnya, hal.dll saya masih menunjukkan 10.0.10586.0 (th2_release.151029-1700), sementara winload.exe memiliki 10.0.10586.63 (th2_release.160104-1513).
melak47
2
Berikut adalah script kecil yang memperoleh versi dari dll / exe dengan tanggal build tertinggi: inti
melak47
6
Ini bergantung pada detail implementasi di pihak Microsoft yang tidak ada jaminan mereka akan terus melakukannya. Ini berfungsi sekarang tetapi Anda harus menghindari mengandalkan ini jika Anda ingin skrip Anda berfungsi dalam jangka panjang.
Nick
1
@Jaykul Yah, saya tidak setuju, karena 2 alasan. (1) karena angka-angka "1803" itu tidak selalu tersedia (mis. Pada Win8), jadi apa yang harus digunakan di sana? (2) Tidak ada alasan teknis mengapa hanya ada satu yang benar version. OS dibangun (dan dimutakhirkan) oleh bagian-bagian, yaitu Kernel, HAL, UBR, dan fitur dll. Jadi kita harus benar-benar menampilkan semuanya. Dalam hal itu saya pikir BuildLabEx, Kerneldan HAL(agar) akan menjadi cara yang paling tepat untuk memberikan yang lebih tepat versi . Tetapi karena Anda tampaknya tahu apa yang salah , Anda harus memposting apa yang benar .
not2qubit
18
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

kembali

WindowsProductName    WindowsVersion OsHardwareAbstractionLayer
------------------    -------------- --------------------------
Windows 10 Enterprise 1709           10.0.16299.371 
Lars Fosdal
sumber
@ not2qubit Benarkah? Sekitar 1 detik di Buku Permukaan saya 2.
Eric Herlitz
14

Sejak PowerShell 5:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

Saya pikir perintah ini cukup banyak mencoba 1001 cara yang berbeda sejauh ini ditemukan untuk mengumpulkan informasi sistem ...

Schadowy
sumber
Bagian dari respons yang saya dapatkan dari ini aneh ... Saya di Windows 10 1909, tetapi "WindowsCurrentVersion" adalah 6.3. Saya akan berpikir itu akan menjadi 10, karena 6.3 adalah Windows 8.1. Kalau tidak, saya suka informasi yang diberikan oleh perintah ini
Randy
8

Jika Anda ingin membedakan antara Windows 8.1 (6.3.9600) dan Windows 8 (6.2.9200) gunakan

(Get-CimInstance Win32_OperatingSystem).Version 

untuk mendapatkan versi yang tepat. [Environment]::OSVersiontidak berfungsi dengan baik di Windows 8.1 (mengembalikan versi Windows 8).

MoonStom
sumber
Perhatikan bahwa [Environment]::OSVersionbekerja di windows-10 , OSVersion.Version.Majormengembalikan 10.
yzorg
1
Keduanya (Get-CimInstance Win32_OperatingSystem).Versiondan [Environment]::OSVersionberfungsi untuk saya dan mengembalikan hasil yang sama: 6.3.9600.0
VirtualVDX
sayangnya 6.3.9600 tidak hanya Win 8.1, server 2012 R2 juga mengembalikan nomor build yang sama.
bytejunkie
8

Saya menyempurnakan salah satu jawabannya

Saya mencapai pertanyaan ini ketika mencoba mencocokkan keluaran dari winver.exe:

Version 1607 (OS Build 14393.351)

Saya dapat mengekstrak string build dengan:

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

Hasil: 14393.351

Diperbarui : Ini adalah skrip yang sedikit disederhanakan menggunakan regex

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

Saya mengambil skrip di atas dan sedikit men-tweak mereka untuk datang dengan ini:

$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

Untuk mendapatkan hasil seperti ini:

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

Petunjuk: Saya akan menghargai tulisan tangan awalan dari tanggal pemasangan sehingga saya bisa menggantinya dengan header yang lebih mudah dibaca.

Ron MVP
sumber
Perintah install date membutuhkan waktu untuk berjalan, jadi saya menemukan yang lebih cepat: [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970')).AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate) Ini sedikit lebih kompleks, tetapi berjalan jauh lebih cepat. Anda bahkan mungkin dapat meninggalkan bagian zona waktu:([datetime]'1/1/1970').AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate)
Randy
4

Seperti yang dikatakan MoonStom, [Environment]::OSVersiontidak berfungsi dengan baik pada Windows 8.1 yang ditingkatkan (mengembalikan versi Windows 8): tautan .

Jika Anda ingin membedakan antara Windows 8.1 (6.3.9600) dan Windows 8 (6.2.9200), Anda dapat menggunakan (Get-CimInstance Win32_OperatingSystem).Versionuntuk mendapatkan versi yang tepat. Namun ini tidak berfungsi di PowerShell 2. Jadi gunakan ini:

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

Menggunakan:

Get-WmiObject -class win32_operatingsystem -computer computername | Select-Object Caption
Mac
sumber
Bisa juga mendapatkan nomor versi menggunakan ini: Get-WmiObject -class win32_operatingsystem | pilih Versi
KERR
Anda dapat meningkatkan jawaban ini dengan menunjukkan hasilnya.
james.garriss
4

Jika Anda mencoba menguraikan informasi yang diletakkan MS di situs tambalan mereka seperti https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

Anda memerlukan kombo seperti:

$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

Michael Joyce
sumber
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
}

Untuk tampilan (kedua versi):

"{0}  ({1})" -f $windows.Caption, $windows.Version 
Vince Ypma
sumber
2

Untuk menghasilkan output yang identik dengan winver.exe di PowerShell v5 pada Windows 10 1809:

$Version = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\'
"Version $($Version.ReleaseId) (OS Build $($Version.CurrentBuildNumber).$($Version.UBR))"
James Russell
sumber
Juga cocok dengan versi di "Settings> System> Tentang" pada Windows 10. Dan mendapat Perbarui Build Revisi kanan, yang banyak solusi yang tidak pada mesin saya 👍
Vimes
1
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name BuildLabEx).BuildLabEx
Uji
sumber
1

Ini benar-benar utas yang panjang, dan mungkin karena jawaban yang benar meskipun tidak menyelesaikan pertanyaan mendasar. Saya menemukan situs ini: Versi & Angka Bangun yang memberikan gambaran yang jelas tentang apa yang ada di dunia Microsoft Windows.

Karena minat saya adalah untuk mengetahui OS windows mana yang saya hadapi, saya mengesampingkan seluruh pelangi versi dan sebaliknya berfokus pada BuildNumber. Nomor build dapat diperoleh dengan:

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

atau dengan:

(Get-CimInstance Win32_OperatingSystem).buildNumber

pilihan ada di tangan Anda mana yang Anda inginkan. Jadi dari sana saya bisa melakukan sesuatu seperti:

    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

Catatan: Seperti yang Anda lihat, saya menggunakan di atas hanya untuk sistem server, namun dapat dengan mudah diterapkan ke workstation atau bahkan diperluas untuk mendukung keduanya ... tapi saya akan menyerahkannya kepada Anda.

Nikmati, & bersenang-senanglah!

Gemuk
sumber
0

Ini akan memberi Anda versi Windows yang lengkap dan BENAR (nomor versi yang sama dengan yang Anda temukan ketika menjalankan winver.exe) (termasuk nomor revisi / build) secara REMOTELY tidak seperti semua solusi lain (diuji pada 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
sumber
Saya mendapat kesalahan menjalankan ini dengan 'localhost' dan menggunakan nama komputer yang sebenarnya (seperti yang dikembalikan oleh 'hostname') di localhost saya - apakah mungkin untuk mengubah solusi ini untuk memungkinkannya mendapatkan informasi dari mesin lokal tanpa mengaktifkan layanan dll?
monojohnny
[xxxxxx] Menyambung ke server jarak jauh xxxxxx gagal dengan pesan kesalahan berikut: Klien tidak dapat terhubung ke tujuan yang ditentukan dalam permintaan. Verifikasi bahwa layanan di tujuan sedang berjalan dan menerima permintaan. Konsultasikan log dan dokumentasi untuk layanan WS-Manajemen berjalan di tujuan, paling sering IIS atau WinRM. Jika tujuan adalah layanan WinRM, jalankan perintah berikut pada tujuan untuk menganalisis dan mengkonfigurasi layanan WinRM: "winrm quickconfig". Untuk informasi lebih lanjut, [...]
monojohnny
Bekerja untukku. Terpilih. Itu akan menjadi skrip yang sempurna jika akan menyertakan id rilis windows 10 - 1507, 1511, 1607 dll.
Anton Krouglov
0

Saya mencari banyak untuk mengetahui versi yang tepat, karena server WSUS menunjukkan versi yang salah. Yang terbaik adalah untuk mendapatkan revisi dari kunci registri 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
sumber
0

Menggunakan Windows Powershell, dimungkinkan untuk mendapatkan data yang Anda butuhkan dengan cara berikut

Keterangan:

(Get-WmiObject -class Win32_OperatingSystem).Caption

ReleaseId:

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

Versi: kapan:

(Get-CimInstance Win32_OperatingSystem).version
Dan Steve
sumber
0

[terpecahkan]

#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-----------------#
Perdana Nobel
sumber
Selamat datang di SO! Ketika Anda menjawab pertanyaan, coba jelaskan sedikit. Dalam hal ini, ada 20 balasan lagi jadi pertimbangkan untuk mengekspos kelebihan Anda.
David García Bodego
0

Anda juga dapat menggunakan sesuatu seperti ini, dengan memeriksa 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
sumber
-2

Anda dapat menggunakan python, untuk menyederhanakan banyak hal (berfungsi pada semua versi Windows dan semua platform lainnya):

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
sumber
Pertanyaannya adalah "Bagaimana menemukan versi Windows dari baris perintah PowerShell ". Ini sebenarnya bukan jawaban untuk pertanyaan itu dan Anda harus mempertimbangkan untuk menghapusnya.
Alain O'Dea
-3
$OSVersion = [Version](Get-ItemProperty -Path "$($Env:Windir)\System32\hal.dll" -ErrorAction SilentlyContinue).VersionInfo.FileVersion.Split()[0]

Pada Windows 10 pengembalian: 10.0.10586.420

Anda kemudian dapat menggunakan variabel untuk mengakses properti untuk perbandingan granular

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

Selain itu, Anda dapat membandingkan versi sistem operasi menggunakan yang berikut ini

If ([Version]$OSVersion -ge [Version]"6.1")
   {
       #Do Something
   }
Solusi Grace
sumber