Как найти версию 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
Как мне это сделать?
19 ответов:
поскольку у вас есть доступ к библиотеке .NET, вы можете получить доступ к
OSVersionсвойстваSystem.Environmentкласса, чтобы получить эту информацию. Для номера версии, естьVersionсобственность.например,
PS C:\> [System.Environment]::OSVersion.Version Major Minor Build Revision ----- ----- ----- -------- 6 1 7601 65536подробности о версиях Windows можно найти здесь.
чтобы получить номер версии Windows, Как отмечает Джефф в своем ответ использовать:
[Environment]::OSVersionстоит отметить, что результат имеет тип
[System.Version], так что можно проверить, скажем, Windows 7 / Windows Server 2008 R2 и позже с[Environment]::OSVersion.Version -ge (new-object 'Version' 6,1)однако это не скажет вам, если это клиент или сервер Windows, ни имя версии.
использовать 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 -PassThruWindows 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, $verMicrosoft 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