如何从PowerShell命令行查找Windows版本


132

如何找到我使用的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 '19

Answers:


184

由于您可以访问.NET库,因此可以访问该类的OSVersion属性System.Environment以获取此信息。对于版本号,有Version属性。

例如,

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

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

Windows版本的详细信息可以在这里找到。


4
请注意,[Environment]::OSVersion在工作窗口-10OSVersion.Version.Major收益10
yzorg

4
运行时,winver它将显示版本1607。但是,上面的powershell命令没有给出1607。在Powershell中,哪里可以得到这个“ 1607”数字?
CMCDragonkai

6
@CMCDragonkai(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId
Anton Krouglov

3
从Windows 8.1开始不推荐使用此方法。有关详细信息,请参见此链接
Slogmeister Extraordinaire

1
@SlogmeisterExtraordinaire该命令[System.Environment]::OSVersion尚未被弃用,其在后台使用的方法已被弃用。新的PS版本正在改变后端行为:github.com/PowerShell/PowerShell/issues/…–
Randy

109
  1. 如Jeff在其答案中所述,要获取Windows版本号,请使用:

    [Environment]::OSVersion

    值得注意的是,结果的类型为[System.Version],因此可以检查Windows 7 / Windows Server 2008 R2及更高版本,例如

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

    但是,它不会告诉您是客户端Windows还是服务器Windows,也不会告诉您版本名称。

  2. 使用WMI的Win32_OperatingSystem类(总是单个实例),例如:

    (Get-WmiObject -class Win32_OperatingSystem).Caption

    将返回类似

    Microsoft®WindowsServer®2008标准


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旗舰版

4
建议在新代码中使用Get-CimInstance而不是Get-WmiObject。
Der_Meister

2
@Der_Meister这仅适用于PSv3 +
Maximilian Burszley

20

与上述所有解决方案不同,这将为您提供完整版本的Windows(包括修订/内部版本号)

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

结果:

10.0.10240.16392 (th1_st1.150716-1608)

5
就我而言,这是最好的解决方案,因为它可以正确报告修订号。其他都不是(至少我已经测试过)。
BStateham '16

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:要点
melak47

6
这取决于Microsoft方面的实现细节,不能保证他们会继续这样做。它现在可以使用,但是如果您希望脚本长期运行,则应避免依赖它。
尼克,

1
@Jaykul好吧,我不同意,原因有两个。(1)因为那些类似“ 1803”的数字并不总是可用(例如,在Win8上),那么在那里应该使用什么?(2)没有技术上的理由说明为什么只有一个正确version。该操作系统由内核,HAL,UBR和功能部件等部分构建(和更新)。因此,我们应该真正将它们全部显示出来。在这方面,我认为BuildLabExKernelHAL(按顺序)将是给更合适的最合适的方式的版本。但是,既然您似乎知道什么是错的,则应该发布什么是对的
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。否则,我喜欢此命令提供的信息
Randy

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在工作窗口-10OSVersion.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

要获得这样的结果:

Microsoft Windows 10 Home 64位版本:1709内部版本:16299.431 @ {WindowsInstallDateFromRegistry = 18-01-01 2:29:11 AM}

提示:我希望能从安装日期中删除前缀文本,以便可以用可读性更高的标题替换它。


install date命令需要一段时间才能运行,所以我找到了一个更快的命令:[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)
Randy

4

正如MoonStom所说,[Environment]::OSVersion在升级的Windows 8.1(返回Windows 8版本)上不能正常工作:link

如果要区分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/zh-cn/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家庭版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

要在Windows 10 1809上的PowerShell v5中产生与winver.exe相同的输出:

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

它还与Windows 10中“设置>系统>关于”中的版本匹配,并且获得了“更新构建修订版”权利,而许多解决方案都不在我的计算机上mes
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

与所有其他解决方案(在Windows 10上经过测试)不同,这将为您提供Windows的完整版和正确的(运行winver.exe时,您会找到相同的版本号)版本(包括修订/内部版本号)。

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"
    }
}

我在使用“本地主机”运行此错误,并在本地主机上使用实际的计算机名称(由“主机名”返回),可以调整此解决方案,以使其从本地计算机获取信息而无需启用服务等?
monojohnny

[xxxxxx]连接到远程服务器xxxxxx失败,并显示以下错误消息:客户端无法连接到请求中指定的目标。验证目标上的服务正在运行并且正在接受请求。有关在目标(通常是IIS或WinRM)上运行的WS-Management服务的日志和文档,请查阅。如果目标是WinRM服务,请在目标上运行以下命令以分析和配置WinRM服务:“ winrm quickconfig”。有关更多信息,[...]
monojohnny

为我工作。已投票。如果它将包括Windows 10版本ID-
1507、1511、1607

0

我进行了大量搜索以查找确切的版本,因为WSUS服务器显示错误的版本。最好的方法是从UBR注册中心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

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多个回复,因此请考虑公开您的优点。
DavidGarcíaBodego,

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

问题是“如何从PowerShell命令行查找Windows版本”。这实际上不是该问题的答案,您应该考虑删除它。
阿兰·奥德

-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
   }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.