如何从命令提示符或PowerShell获取Windows版本

44

Windows version.

是否有办法通过命令行输出来获取类似于图片中提到的精确版本字符串?

附图是从运行中的“winver”命令生成的输出。注:我正在寻找批处理或PowerShell命令。

还有一些替代方法可用于获取Windows版本,例如此PowerShell命令:

[System.Environment]::OSVersion

1
(几乎?)重复的问题:如何在非特权用户命令行中查找Windows版本 - Aaron Thoma
8个回答

41

ver 命令 显示的内容类似这样:

> ver

Microsoft Windows [Versión 10.0.17134.228]

但在PowerShell(或Git Bash)中,您必须通过cmd命令调用它:

> cmd /c ver

1
很好的回答,与仅使用systeminfo相比,你获得了更完整的版本信息。例如,systeminfo返回10.0.20348 N/A Build 20348,而ver则返回Version 10.0.20348.202 - Bink
不显示专业版、家庭版和企业版。至少不是直接显示。 - Radim Cernej

34
以下命令将帮助您完成此操作。如果您需要更多信息,请键入 systeminfo:

以下命令将帮助您完成此操作。如果您需要更多信息,请键入systeminfo

systeminfo | findstr /B /C:"OS Name" /C:"OS Version"

wmic os get Caption,CSDVersion /value

这将输出: systeminfo | findstr /B /C:“OS Name” /C:“OS Version” 操作系统名称:Microsoft Windows Server 2016 Standard 操作系统版本:10.0.14393 N/A Build 14393 “版本1607”缺失。没有任何方法可以同时捕获吗?或者我需要手动将版本1607映射到14393吗? - Sandie
8
针对Windows 10,第二个选项应该是:wmic os get Caption, BuildNumber /value - zvi
1
wmic命令速度更快,如果您需要检查许多服务器,则非常有用。 - twasbrillig
Windows 10系统 - 第二个命令失败,显示“无效的GET表达式”。 - vsync
输出是本地化的,因此第一个选项在不使用英语语言的系统上通常无法工作。 为了使第二个选项在更多系统上工作,可以将其组合起来:wmic os get Caption, CSDVersion, BuildNumber /value - Simon Sobisch

11

我在某个地方找到了它,PowerShell:

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

1
releaseid在21h1中不再适用,现在使用displayversion。但是这对于旧版本来说并不存在。 - az1d
@az1d,它仍然应该有releaseId,对吧?他们实现了20h1版本的DisplayVersion吗? - knile
2
releaseid无论操作系统版本如何均返回2009(所有操作系统版本从现在开始都返回2009) displayversion仅适用于20H2和21h1。 - az1d

3

补充 @Bonifacio 的回答:

REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | findstr ReleaseId

更好的方式是使用返回仅ReleaseId值的命令,然后将其导入文件。如果您需要处理多个主机,这将非常有用。
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | findstr ReleaseId > any_path\%COMPUTERNAME%_OS_Version.txt

在查询注册表时,最好使用/v开关直接查询您的值,而不是返回该注册表键下的所有内容以传递到管道中。 - Amit Naidu
1
releaseid在21h1中不再适用,现在使用displayversion。但是这对于旧版本来说并不存在。 - az1d

1

使用系统信息,您只能获取该值的构建版本并前往Google获取相应的版本。

然而,一种简单的方法是通过命令行搜索注册表:

REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | findstr REG_SZ

这是过去几年中的一个好答案,但现在它对于Windows 11不起作用。这个注册表键中的所有内容仍然显示为Windows 10。 - avery_larry

1

说实话,我将几个答案合并成了这个PowerShell函数。(我使用的是pwsh 7.2.1进行测试。)

<#
.SYNOPSIS
    Gets information about the version of windows this session is running on.

.OUTPUTS
    A hashtable with various key/value pairs containing version information.

.EXAMPLE
    PS> $winver = Get-Winver
    PS> $winver
    
    Name                           Value
    ----                           -----
    DisplayVersion                 21H2
    ProductName                    Windows 10 Enterprise
    CurrentBuildNumber             19044
    KeyName                        HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion
    Version                        10.0.19044.0
    VersionString                  Microsoft Windows NT 10.0.19044.0
    OsVersion                      Microsoft Windows NT 10.0.19044.0

    PS> $winver.Version    

    Major  Minor  Build  Revision
    -----  -----  -----  --------
    10     0      19044  0

#>
function Get-Winver {
    $keyName = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion"
    $versionKey = (Get-Item $keyName)
    $displayVersion = $versionKey.GetValue("DisplayVersion")
    $productName = $versionKey.GetValue("ProductName")
    $currentBuildNumber = $versionKey.GetValue("CurrentBuildNumber")

    $osver = [System.Environment]::OSVersion

    $winver = [Ordered]@{
        "DisplayVersion"     = $displayVersion
        "ProductName"        = $productName
        "CurrentBuildNumber" = $currentBuildNumber
        "KeyName"            = $keyName
        "Version"            = $osver.Version
        "VersionString"      = $osver.VersionString
        "OsVersion"          = $osver
    }

    return $winver
}

这是过去几年中的一个好答案,但现在它对于Windows 11不起作用。这个注册表键中的所有内容仍然显示为Windows 10。 - avery_larry

1
“reg query”的方式建议输出的内容有点杂乱无章。
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | findstr ReleaseId
Output:
ReleaseId    REG_SZ    2009

使用带有标记的for循环将输出干净的信息。
for /f "tokens=3" %i in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ^| findstr ReleaseId') do echo %i
Output:
2009

“tokens=3” 是指原始输出中的第三个单词。
如果在批处理文件中运行,请将“%”加倍。
您可以通过将“echo %i”替换为“set build = %i”来设置输出为变量。
还要记得转义任何特殊字符。
最后,请查看“HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion”以获取所需值的字符串。您可能需要调整标记计数。

1
findstr is not needed if you use skip and query only the Key Value you need using /v instead of the entire Registry Key : for /f "skip=2 tokens=2*" %i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ReleaseId') do @echo %j - Amit Naidu
1
releaseid在21H1上已不再适用,现在使用的是displayversion。但是这对于旧版本来说是不存在的。 - az1d

0

在cmd中,您可以使用-ver

C:\ Users \ user_user> ver

在PowerShell中 来自: {{link1:如何从PowerShell命令行查找Windows版本}}

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


据我所知,这实际上并没有为其他提供的答案增添任何新内容。 - JBartlau
这是过去几年中的一个好答案,但现在它不能正确区分Windows 10/11/2016/2019。 - avery_larry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接