Как найти версию для Windows из командной строки PowerShell


134

Как узнать, какую версию 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

Ответы:


188

Поскольку у вас есть доступ к библиотеке .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. Но приведенная выше команда powershell не дает 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/issues/…
Рэнди,

110
  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


62

К сожалению, большинство других ответов не содержат информации, относящейся к 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 05

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 Максимальная

4
В новом коде рекомендуется использовать Get-CimInstance вместо Get-WmiObject.
Der_Meister

2
@Der_Meister Это верно только для PSv3 +
Максимилиан Бёрсли

21

Это даст вам полную версию 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

20
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, server 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 2: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

Microsoft Windows 10 Home, 64-разрядная версия 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
}

Для дисплея (обе версии):

"{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. И получает обновление сборки Revision право, которое многие из решений не на моей машине 👍
Ваймс

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

1

Это действительно длинная цепочка, и, вероятно, потому, что ответы, хотя и верные, не решают фундаментального вопроса. Я наткнулся на этот сайт: Номера версий и сборок который дает четкое представление о том, что есть что в мире Microsoft Windows.

Поскольку меня интересует, с какой именно ОС Windows я имею дело, я оставил в стороне всю версию Rainbow и вместо этого сосредоточился на 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» и используя фактическое имя компьютера (возвращаемое «hostname») на моем локальном хосте - можно ли настроить это решение, чтобы оно могло получать информацию с локального компьютера без включения служб и т. Д.?
monojohnny

[xxxxxx] Не удалось подключиться к удаленному серверу xxxxxx со следующим сообщением об ошибке: Клиент не может подключиться к месту назначения, указанному в запросе. Убедитесь, что служба в пункте назначения работает и принимает запросы. См. Журналы и документацию для службы WS-Management, работающей в месте назначения, чаще всего IIS или WinRM. Если местом назначения является служба WinRM, выполните следующую команду в месте назначения, чтобы проанализировать и настроить службу WinRM: «winrm quickconfig». Для получения дополнительной информации [...]
monojohnny

Работал у меня. Upvoted. Это был бы идеальный сценарий, если бы он включал идентификатор выпуска Windows 10 - 1507, 1511, 1607 и т. Д.
Антон Круглов

0

Я много искал, чтобы узнать точную версию, потому что сервер WSUS показывает неправильную версию. Лучше всего получить ревизию из КЛЮЧА реестра 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

0

Используя Windows Powershell, можно получить нужные данные следующим образом

Надпись:

(Get-WmiObject -class Win32_OperatingSystem).Caption

ReleaseId:

(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.