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



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


Как мне это сделать?

1049   19  

19 ответов:

поскольку у вас есть доступ к библиотеке .NET, вы можете получить доступ к OSVersion свойства System.Environment класса, чтобы получить эту информацию. Для номера версии, есть Version собственность.

например,

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

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

подробности о версиях Windows можно найти здесь.

  1. чтобы получить номер версии Windows, Как отмечает Джефф в своем ответ использовать:

    [Environment]::OSVersion
    

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

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

    однако это не скажет вам, если это клиент или сервер Windows, ни имя версии.

  2. использовать WMI Win32_OperatingSystem класс (всегда один экземпляр), например:

    (Get-WmiObject -class Win32_OperatingSystem).Caption
    

    возвращает что-то вроде

    Microsoft® Windows Server® 2008 Standard

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

или в гольф

gwmi win32_operatingsystem | % caption

результат

Microsoft Windows 7 Ultimate

к сожалению, большинство других ответов не предоставляют информацию, относящуюся к Windows 10.

Windows 10 имеет версии о себе: 1507, 1511, 1607, 1703, etc. Вот что 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

это даст вам полная версия Windows (включая номер версии/сборки) в отличие от всех выше решения:

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

результат:

10.0.10240.16392 (th1_st1.150716-1608)

я уточняю один из ответы

Я достиг этого вопроса, пытаясь соответствовать выходу из 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

Обновлено: вот немного упрощенный скрипт с использованием regex

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

Если вы хотите различать Windows 8.1 (6.3.9600) и Windows 8 (6.2.9200), используйте

(Get-CimInstance Win32_OperatingSystem).Version 

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

Начиная С PowerShell 5:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

Я думаю, что эта команда в значительной степени пытается использовать 1001 различные способы, обнаруженные до сих пор для сбора системной информации...

как 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}
}

использование:

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

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 

По словам Ларса Fosdal - как найти версию Windows из командной строки PowerShell?

PS C:\> Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

возвращает

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

можно ли это сделать удаленно? Например, вот так:

Get-WMIObject –class win32_ComputerSystem –computername ProdBIG

поэтому я думаю, что я задаю вопрос неправильно.

есть ли возможность получить эту информацию для другого удаленного компьютера?

(Get-ItemProperty-Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -имя BuildLabEx).BuildLabEx

Это даст вам полный и правильный (тот же номер версии, который вы найдете при запуске 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"
    }
}

Если вы пытаетесь расшифровать информацию 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

Я взял скрипты выше и немного подправил их, чтобы придумать это:

$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

чтобы получить такой результат:

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

подсказка: я был бы признателен за ручное удаление текста префикса с даты установки, чтобы я мог заменить его более читаемым заголовком.

Я много искал, чтобы узнать точную версию, потому что сервер 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
PS C:\> Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

возвращает

WindowsProductName    WindowsVersion OsHardwareAbstractionLayer
------------------    -------------- --------------------------
Windows 10 Enterprise 1709           10.0.16299.371 
$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
   }

Comments

    Ничего не найдено.