Як знайти версію Windows з командного рядка PowerShell


133

Як знайти, яку версію Windows я використовую?

Я використовую PowerShell 2.0 і спробував:

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

Як це зробити?


4
Якщо ви переглядаєте це у 2019 році ++, ігноруйте відповідь, позначену як правильну, та перейдіть безпосередньо до тієї, яка є правильною . Ласкаво просимо.
BrainSlugs83

Відповіді:


186

Оскільки у вас є доступ до бібліотеки .NET, ви можете отримати доступ до OSVersionвластивості System.Environmentкласу, щоб отримати цю інформацію. Щодо номера версії, то єVersion властивість.

Наприклад,

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

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

Деталі версій Windows можна знайти тут .


4
Зауважте, що [Environment]::OSVersionпрацює у windows-10 , OSVersion.Version.Majorповертається 10.
yzorg

4
Коли я запускаю, winverце показує мені версію 1607. Але команда powerhell, наведена вище, не дає 1607. Звідки мені взяти це число "1607" в Powershell?
CMCDragonkai

6
@CMCDragonkai(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId
Антон Круглов

3
Цей спосіб застаріло, як і в Windows 8.1. Детальну інформацію див. За цим посиланням .
Slogmeister Extraordinaire

1
@SlogmeisterExtraordinaire Команда [System.Environment]::OSVersionне була застаріла, метод, який вона використовує у фоновому режимі, застарів. Нові версії PS змінюють поведінку бекенда: github.com/PowerShell/PowerShell/isissue/…
Ранді

109
  1. Щоб отримати номер версії Windows, як зазначає Джефф у своїй відповіді , використовуйте:

    [Environment]::OSVersion

    Варто зазначити, що результат має тип [System.Version], тому можна перевірити, скажімо, Windows 7 / Windows Server 2008 R2 та пізніші версії з

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

    Однак це не скаже вам, чи це клієнт чи сервер Windows, ні назва версії.

  2. Використовуйте Win32_OperatingSystemклас WMI (завжди один екземпляр), наприклад:

    (Get-WmiObject -class Win32_OperatingSystem).Caption

    поверне щось подібне

    Microsoft® Windows Server® 2008 Standard


61

На жаль, більшість інших відповідей не містять інформації, характерної для Windows 10.

У Windows 10 є власні версії : 1507, 1511, 1607, 1703 тощо . Це те, що 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

Дивіться також пов'язане питання щодо суперпользователя .

Що стосується інших версій Windows systeminfo. 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]:...

Вихід Windows 10 для тієї ж команди:

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
Це легко запам'ятати winverна робочому столі та systeminfo на сервері. Мене роками бентежить, що не існує єдиного способу отримання цієї інформації.
MortenB

2
Відмінні посилання на інформацію про MS, що насправді корисно. Слід зазначити , що для Win8.1 (і нижче?) Інфо показана: OS Version : 6.3.9600 N/A Build 9600. Тож у версіях, що знаходяться нижче W81, може бути більш інформативним дивитись на (завжди недооцінені) версії LTSB. Див виходу з: (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").BuildLabExщо може виглядати наступним чином : 9600.19179.amd64fre.winblue_ltsb_escrow.181015-1847. Я здогадуюсь , що 181015частина - дата складання, тоді як версія 1847- це збірка або версія. Вам також може знадобитися порівняти це з ядром, hal .
not2qubit

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

Або гольф

gwmi win32_operatingsystem | % caption

Результат

Microsoft Windows 7 Ultimate

4
Рекомендується використовувати Get-CimInstance замість Get-WmiObject у новому коді.
Der_Meister

2
@Der_Meister Це справедливо лише для PSv3 +
Максиміліан Burszley

20

Це дасть вам повну версію Windows (включаючи номер редакції / збірки) на відміну від усіх вищезазначених рішень:

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

Результат:

10.0.10240.16392 (th1_st1.150716-1608)

5
Що стосується мене, це найкраще рішення, оскільки воно правильно повідомляє номер редакції. Ніхто з інших не є (принаймні, як я їх випробував).
BStateham

6
Це єдине рішення досі, яке дозволило мені отримати повний номер збірки. Однак не всі файли в system32 оновлюються з кожним оновленням - наприклад, мій hal.dll все ще відображається 10.0.10586.0 (th2_release.151029-1700), а winload.exe має 10.0.10586.63 (th2_release.160104-1513).
melak47

2
Ось невеликий сценарій, який отримує версію від dll / exe з найвищою датою складання: gist
melak47

6
Це спирається на деталі впровадження з боку Microsoft, які не мають гарантії, що вони будуть надалі. Він працює зараз, але вам слід уникати покладання на це, якщо ви хочете, щоб ваш сценарій працював у довгостроковій перспективі.
Нік

1
@Jaykul Ну, я не згоден з 2 причин. (1) тому що ці "1803" номери не завжди доступні (наприклад, на Win8), і що тут слід використовувати? (2) Немає технічних причин, чому має бути лише одна правильна version. ОС будується (і оновлюється) частинами, тобто ядром, HAL, UBR та функціями тощо. Тож нам слід справді відобразити всі вони. Я вважаю BuildLabEx, що в цьому відношенні , Kernelі HAL(у такому порядку) було б найбільш підходящим способом надати більш правильну версію . Але оскільки ви, здається, знаєте, що не так , вам слід опублікувати те, що правильно .
not2qubit

18
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

повертає

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

@ not2qubit Дійсно? Близько 1 сек на моїй поверхневій книжці 2.
Ерік Герліц

14

З моменту PowerShell 5:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

Я думаю, що ця команда в значній мірі намагається зібрати 1001 різні способи збору системної інформації ...


Частина відповіді, яку я отримав від цього, дивна ... Я в Windows 10 1909, але "WindowsCurrentVersion" - 6.3. Я думаю, це було б 10, оскільки 6.3 - це Windows 8.1. Інакше мені подобається інформація, яку надає ця команда
Ренді

8

Якщо ви хочете розмежовувати Windows 8.1 (6.3.9600) та Windows 8 (6.2.9200), використовуйте

(Get-CimInstance Win32_OperatingSystem).Version 

щоб отримати належну версію. [Environment]::OSVersionне працює належним чином у Windows 8.1 (повертає версію Windows 8).


Зауважте, що [Environment]::OSVersionпрацює у Windows-10 , OSVersion.Version.Majorповертається 10.
yzorg

1
І те, (Get-CimInstance Win32_OperatingSystem).Versionі [Environment]::OSVersionдля мене працює і повертає той самий результат: 6.3.9600.0
VirtualVDX,

на жаль 6.3.9600 - це не просто Win 8.1, сервер 2012 R2 також повертає цей самий номер збірки.
bytejunkie

8

Я уточнюю одну з відповідей

До цього питання я дійшов, намагаючись співставити вихід з winver.exe:

Version 1607 (OS Build 14393.351)

Я зміг витягти рядок збірки за допомогою:

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

Результат: 14393.351

Оновлено : Ось трохи спрощений сценарій з використанням регулярного виразу

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

5

Я взяв сценарії вище і трохи підмітив їх, щоб придумати це:

$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

Щоб отримати такий результат:

64-розрядна версія для Microsoft Windows 10 Home: 1709 Збірка: 16299.431 @ {WindowsInstallDateFromRegistry = 18-01-01 02:29:11 AM}

Підказка: Я би вдячний руці, що знімає текст префікса з дати встановлення, щоб я міг замінити його на більш читабельний заголовок.


Команда дати встановлення потребує певного часу, тому я знайшов більш швидкий: [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970')).AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate) він трохи складніший, але він працює набагато швидше. Можливо, ви навіть зможете залишити частину часового поясу:([datetime]'1/1/1970').AddSeconds($(get-itemproperty "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").InstallDate)
Ренді

4

Як каже MoonStom, [Environment]::OSVersionна оновленому Windows 8.1 (він повертає версію для Windows 8) не працює належним чином: посилання .

Якщо ви хочете розмежовувати Windows 8.1 (6.3.9600) та Windows 8 (6.2.9200), ви можете скористатися (Get-CimInstance Win32_OperatingSystem).Versionдля отримання належної версії. Однак це не працює в PowerShell 2. Тому використовуйте це:

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

4

Використання:

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

Також можна отримати номер версії, скориставшись цією функцією: Get-WmiObject -class win32_operatingsystem | виберіть Версію
KERR

Ви можете покращити цю відповідь, показавши результат.
james.garriss

4

Якщо ви намагаєтесь розшифрувати інформацію, MS розміщує на їхньому веб-сайті виправлення, наприклад https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

вам знадобиться комбо, наприклад:

$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

64-розрядний 1703 Microsoft Windows 10 Home


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
}

Для відображення (обидві версії):

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

2

Щоб отримати однаковий вихід winver.exe в PowerShell v5 для Windows 10 1809:

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

Крім того, він відповідає версії в "Налаштування> Система> Про" в Windows 10. І отримує право оновлення версії версії, якої багато рішень немає на моїй машині 👍
Vimes

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

1

Це справді довга нитка, і, мабуть, тому, що відповіді, хоч і правильні, не вирішують принципового питання. Я натрапив на цей сайт: Версії та збірки номерів які дали чіткий огляд того, що є у світі Microsoft Windows.

Оскільки мені цікаво знати, з якими саме ОС Windows я маю справу, я залишив осторонь всю версію веселки і замість цього зосередився на BuildNumber. Номер збірки може бути досягнуто або:

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

або:

(Get-CimInstance Win32_OperatingSystem).buildNumber

вибір за вами, коли б ви не віддавали перевагу. Тож звідти я міг би щось зробити за принципом:

    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

Примітка. Як ви бачите, я використав це вище лише для серверних систем, однак це може бути легко застосовано до робочих станцій або навіть розумно розширено для підтримки обох ..., але це я залишу вам.

Насолоджуйтесь і отримуйте задоволення!


0

Це дасть вам повну та ПРАВИЛЬНУ (той самий номер версії, який ви знайдете при запуску winver.exe) версії Windows (включаючи номер версії / версії) ЗАБЕЗПЕЧНО на відміну від усіх інших рішень (тестованих на 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"
    }
}

У мене з’явилася помилка при виконанні цього параметра «localhost» та використання фактичного імені комп’ютера (поверненого «ім’ям хоста») на мій localhost - чи можна підключити це рішення, щоб воно могло отримувати інформацію з локальної машини без включення служб тощо?
monojohnny

[xxxxxx] Підключення до віддаленого сервера xxxxxx не вдалося за допомогою наступного повідомлення про помилку: Клієнт не може підключитися до пункту призначення, вказаного в запиті. Переконайтеся, що служба в пункті призначення працює та приймає запити. Зверніться до журналів та документації для служби WS-управління, що працює в пункті призначення, найчастіше IIS або WinRM. Якщо пунктом призначення є послуга WinRM, запустіть таку команду на пункт призначення, щоб проаналізувати та налаштувати послугу WinRM: "winrm quickconfig". Для отримання додаткової інформації, [...]
monojohnny

Працювали для мене. Отримано. Це був би ідеальний сценарій, якби він включав ідентифікатор випуску Windows 10 - 1507, 1511, 1607 тощо
Антон Круглов

0

Я багато шукав, щоб дізнатися точну версію, тому що сервер WSUS показує неправильну версію. Найкраще - отримати ревізію з реєстру UEB KEY.

    $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, можна отримати потрібні дані наступним чином

Заголовок:

(Get-WmiObject -class Win32_OperatingSystem).Caption

Ідентифікатор випуску:

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

версія:

(Get-CimInstance Win32_OperatingSystem).version

0

[вирішено]

#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! Коли ви відповідаєте на запитання, будь ласка, спробуйте трохи пояснити. У цьому випадку є ще 20 відповідей, тому подумайте викрити свої плюси.
Девід Гарсія Бодего

0

Ви також можете використати щось подібне, перевіривши 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"}

-2

Ви можете використовувати python для спрощення речей (працює на всіх версіях Windows та всіх інших платформах):

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

Питання "Як знайти версію Windows з командного рядка PowerShell ". Це насправді не є відповіддю на це питання, і вам слід розглянути можливість його видалення.
Ален

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

У Windows 10 повернення: 10.0.10586.420

Потім можна використовувати змінну для доступу до властивостей для детального порівняння

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

Крім того, ви можете порівняти версії операційної системи, використовуючи наступні

If ([Version]$OSVersion -ge [Version]"6.1")
   {
       #Do Something
   }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.