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

Posted

技术标签:

【中文标题】如何从 PowerShell 命令行查找 Windows 版本【英文标题】:How to find the Windows version from the PowerShell command line 【发布时间】:2011-11-11 21:52:42 【问题描述】:

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

我该怎么做?

【问题讨论】:

如果您在 2019 年及以后查看此内容,请忽略被标记为的答案并直接访问the one that is correct。不客气。 【参考方案1】:

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

例如,

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

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

Windows 版本详情请见here。

【讨论】:

请注意[Environment]::OSVersion 在windows-10 中有效,OSVersion.Version.Major 返回 10。 当我运行 winver 时,它会显示版本 1607。但上面的 powershell 命令没有给出 1607。我在 Powershell 中哪里可以得到这个“1607”数字? @CMCDragonkai (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId 从 Windows 8.1 开始不推荐使用此方法。有关详细信息,请参阅此link。 @SlogmeisterExtraordinaire 命令[System.Environment]::OSVersion 未被弃用,它在后台使用的方法已被弃用。新的 PS 版本正在改变后端行为:github.com/PowerShell/PowerShell/issues/…【参考方案2】:

    要获取 Windows 版本号,正如 Jeff 在他的 answer 中所说,使用:

    [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 标准版

【讨论】:

Get-WmiObject 警告:有时需要几秒钟才能返回 [Environment]::OSVersion 不可靠devblogs.microsoft.com/scripting/…【参考方案3】:

不幸的是,大多数其他答案都没有提供特定于 Windows 10 的信息。

Windows 10 有自己的versions: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

另见related question on superuser。

至于其他 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

【讨论】:

这在桌面上很容易记住winver,在服务器上很容易记住systeminfo。多年来我一直很困惑,没有统一的方式来获取这些信息。 非常有用的 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 是构建或发布版本。您可能还需要将此与 kernel, hal 进行比较。 应该是 2020 年公认的答案。嘿,SO Team,这些年来我们可以改变公认的答案吗?这是meta 的问题吗? releaseid 不再适用于 21h1,而是现在使用 displayversion。旧版本不存在【参考方案4】:
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

返回

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

【讨论】:

@not2qubit 真的吗?在我的 Surface Book 2 上大约 1 秒。 获取计算机信息 |选择 WindowsVersion 不再适用于 21h1 - 它显示 2009(与 20h2 相同) 这很烦人......微软是如此......一致。不是。【参考方案5】:

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

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

结果:

10.0.10240.16392 (th1_st1.150716-1608)

【讨论】:

就我而言,这是最好的解决方案,因为它可以正确报告修订号。其他都不是(至少我已经测试过了)。 这是迄今为止唯一能让我获得完整版本号的解决方案。 然而,并不是system32中的所有文件都会随着每次更新而更新——例如,我的hal.dll仍然显示10.0.10586.0 (th2_release.151029-1700),而winload.exe有10.0.10586.63 (th2_release.160104-1513) 这里有一个小脚本,可以从 dll/exe 中获取最高构建日期的版本:gist 这依赖于微软方面的实施细节,不能保证他们会继续这样做。它现在可以工作,但如果你希望你的脚本长期工作,你应该避免依赖它。 @Jaykul 好吧,我不同意,有两个原因。 (1)因为那些“1803”之类的数字并不总是可用的(例如在Win8上),那么应该在那里使用什么? (2) 没有技术原因为什么应该只有一个正确的version。操作系统是由部分构建(和更新)的,即内核、HAL、UBR 和 功能 等。所以我们应该真正显示所有这些。在这方面,我认为BuildLabExKernelHAL(按此顺序)将是提供更合适的版本 的最合适方式。但既然你似乎知道什么是,你应该发布什么是正确【参考方案6】:

从 PowerShell 5 开始:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

我认为这个命令几乎尝试了迄今为止发现的 1001 种不同的方法来收集系统信息......

【讨论】:

我得到的部分响应很奇怪......我在 Windows 10 1909 上,但“WindowsCurrentVersion”是 6.3。我认为那将是 10,因为 6.3 是 Windows 8.1。否则,我喜欢这个命令提供的信息【参考方案7】:

如果您想区分 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。 (Get-CimInstance Win32_OperatingSystem).Version[Environment]::OSVersion 都为我工作并返回相同的结果:6.3.9600.0 不幸的是 6.3.9600 不仅仅是 Win 8.1,服务器 2012 R2 也返回相同的内部版本号。【参考方案8】:

我正在提炼其中一个answers

我在尝试匹配 w​​inver.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 

【讨论】:

【参考方案9】:

如果您试图破译 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 家庭版 64 位 1703

【讨论】:

【参考方案10】:

我采用了上面的脚本并对其进行了一些调整以得出以下结论:

$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

提示:我希望能从安装日期中删除前缀文本,以便我可以将其替换为更易读的标题。

【讨论】:

安装日期命令需要一段时间才能运行,所以我找到了一个更快的:[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)【参考方案11】:

要在 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 中“设置 > 系统 > 关于”中的版本相匹配。并且获得了正确的更新构建版本,这在我的机器上没有许多解决方案 ? 这停止了对我的工作。 WinVer.exe 显示Version 20H2 (OS Build 19042.804),但这给出了Version 2009 (OS Build 19042.804)。将ReleaseId 更改为DisplayVersion 可以解决此问题,但旧操作系统没有DisplayVersion releaseid 不再适用于 21h1,而是现在使用 displayversion。旧版本不存在【参考方案12】:

正如 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

【讨论】:

【参考方案13】:

用途:

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

【讨论】:

也可以使用这个获取版本号:Get-WmiObject -class win32_operatingsystem |选择版本 您可以通过显示输出来改进此答案。【参考方案14】:

应该像这样简单:

Get-ComputerInfo  | select windowsversion

【讨论】:

获取计算机信息 |选择 WindowsVersion 不再适用于 21h1 - 它显示 2009(与 20h2 相同) 我需要添加,使用Powershell执行这个命令,谢谢【参考方案15】:

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 

【讨论】:

【参考方案16】:

这确实是一个很长的话题,可能是因为答案虽然正确,但并没有解决基本问题。 我偶然发现了这个网站:Version & Build Numbers,它清楚地概述了 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

注意:如您所见,我将上述内容仅用于服务器系统,但它可以轻松应用于工作站,甚至可以巧妙地扩展以支持两者......但我将把它留给你。

尽情享受,玩得开心!

【讨论】:

我很乐意将其应用于工作站,但 PS 如何检测它是在 Windows Server 还是简单的 Windows PC 上运行? Windows 客户端操作系统版本具有不同的构建值,请查看此 Microsoft 链接:docs.microsoft.com/en-us/windows/win32/sysinfo/…。另外你需要检查产品类型:(Get-CimInstance Win32_OperatingSystem).productType,如果它等于1那么它是一个客户端 The link you gave 没有给出构建值但是""+[Environment]::OSVersion.Version.Major+"."+[Environment]::OSVersion.Version.Minor 你有包含微软官方构建表的链接吗? @SebMa 请参阅Windows 10 release information,在网页底部有每个已发布版本的构建表以及每个版本的构建号。这里是Windows 11 release information。【参考方案17】:

你们太努力了。这适用于使用 Enter-PSSession 的本地或远程会话 - 试一试。

您只需输入:

cmd ?

Microsoft Windows [版本 10.0.19042.1237]

【讨论】:

【参考方案18】:
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name BuildLabEx).BuildLabEx

【讨论】:

【参考方案19】:
(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Update\TargetingInfo\Installed\Client.OS.rs2.amd64').version

根据 Tim 之前的回答,这个特定位置的好处是该属性已经处于我所说的首选格式。

【讨论】:

【参考方案20】:

相当于 winver 的 Powershell

适用于 20h2 之前的所有 Windows 10 版本,速度快且复杂*

function Get-WinVer() 
    $win_release = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").displayversion
    if (!($win_release)) 
        $win_release = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").ReleaseId
    $win_release

Get-WinVer

它准确地显示了winver.exe 在“版本”旁边显示的内容。

我没想到要读这么多才能写出这段代码,我真的希望我不必为 22 小时(或当时的名字)调整它。


*:微软确实让它变得比它应该的更复杂

【讨论】:

【参考方案21】:

这将为您提供 Windows 的完整和正确(与您在运行 winver.exe 时找到的相同版本号)版本(包括修订/内部版本号),与所有其他解决方案(在 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' 运行它并在我的 localhost 上使用实际计算机名(由 'hostname' 返回)时出错 - 可以调整此解决方案以允许它从本地机器没有启用服务等? [xxxxxx] 连接到远程服务器 xxxxxx 失败并显示以下错误消息:客户端无法连接到请求中指定的目标。验证目标上的服务是否正在运行并且正在接受请求。请查阅在目标(最常见的是 IIS 或 WinRM)上运行的 WS-Management 服务的日志和文档。如果目标是 WinRM 服务,在目标上运行以下命令来分析和配置 WinRM 服务:“winrm quickconfig”。欲了解更多信息,[...] 为我工作。赞成。如果它包含 Windows 10 版本 ID - 1507、1511、1607 等,那将是一个完美的脚本。【参考方案22】:

我搜索了很多以找出确切的版本,因为 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

【讨论】:

【参考方案23】:

使用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

【讨论】:

releaseid 不再适用于 21h1,而是现在使用 displayversion。旧版本不存在【参考方案24】:

[已解决]

#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 条回复,因此请考虑公开您的优点。【参考方案25】:

您也可以通过检查 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"

【讨论】:

【参考方案26】:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Update\TargetingInfo\Installed\Client.OS.rs2.amd64\Version '对于 Win 10 客户端'

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Update\TargetingInfo\Installed\Server.OS.amd64\Version '对于服务器操作系统'

【讨论】:

嗨,蒂姆,您能解释一下这有助于找到问题的答案吗?我碰巧现在这些是 Windows 注册表地址,但不是每个人都会。此外,还询问了如何在 PowerShell 中执行此操作。您可以在 PowerShell 中添加代码来说明如何执行此操作吗?【参考方案27】:

我只想完成一个小脚本。我们使用了之前回答过的switch版本,只是详细说明了。没有地方会给你我们习惯的友好名称。 Windows 10 1909 或 Windows 10 20H2。所以我们必须手动编程。

$osversion = (Get-CimInstance -class Win32_OperatingSystem).Caption
$buildnumber = (Get-CimInstance Win32_OperatingSystem).BuildNumber
if($osversion -match "Windows 10")
   
    switch ($buildnumber) 
     
        10240 $OS = "Windows 10 1507"
        10586 $OS = "Windows 10 1511"
        14393 $OS = "Windows 10 1607"
        15063 $OS = "Windows 10 1703"
        16299 $OS = "Windows 10 1709"
        17134 $OS = "Windows 10 1803"
        17763 $OS = "Windows 10 1809"
        18362 $OS = "Windows 10 1903"
        18363 $OS = "Windows 10 1909"
        19041 $OS = "Windows 10 20H1"
        19042 $OS = "Windows 10 20H2"
        19043 $OS = "Windows 10 21H1"
        default  $OS = "Not Listed"
    

if($osversion -match "Windows Server")

    switch ($buildnumber) 
    
        3790 $OS = "Windows Server 2003 R2"
        6001 $OS = "Windows Server 2008"
        7600 $OS = "Windows Server 2008 SP1"
        7601 $OS = "Windows Server 2008 R2"    
        9200 $OS = "Windows Server 2012"
        9600 $OS = "Windows Server 2012 R2"
        14393 $OS = "Windows Server 2016"
        17763 $OS = "Windows Server 2019"
    

Write-Host "Server system: $OS | $osversion | $buildnumber" -foregroundcolor Green

现在,如果您想像我想使用 invoke-commandnew-pssession 一样一次扫描多台电脑 请注意Get-WMIObject 已贬值并替换为get-ciminstance

如果您需要我稍后提供的示例 如果您使用的是 windows 2003 R2 或更早版本.. 停止移动到新的操作系统。

【讨论】:

【参考方案28】:

powershell 中 C:\ 提示符或 cmd 提示符窗口中的 systeminfo 提供操作系统名称版本配置制造商等等...

【讨论】:

这在其他答案中已经提到了。 这是否适用于 MS Windows 10【参考方案29】:

除了其他答案之外,这里还有一些可以使用 PowerShell 检索的有用信息:

通过 PowerShell 查询操作系统和硬件信息:

查询通用操作系统(操作系统)信息:

查看操作系统名称的最快方法:

cmd ?

#Using Get-ComputerInfo:

Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

#Using Get-WmiObject:

$name=(Get-WmiObject Win32_OperatingSystem).caption
$bit=(Get-WmiObject Win32_OperatingSystem).OSArchitecture
$ver=(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").ReleaseId
Write-Host " OS-Name: `t $name `n Architct: `t $bit  `n Release: `t $ver" 

列出主要次要版本信息:

[System.Environment]::OSVersion.Version 

查询主机名:

$Env:ComputerName

hostname    #cmd command

另外,如果您知道 IP 地址,使用“ping”命令(例如:ping /a &lt;your_ip_address&gt;)您将在第一行看到您的“主机名”。

查询当前(登录)用户:

whoami    #cmd command

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

查询映射驱动器: 列出映射驱动器 - 使用 WMI:

Get-WmiObject -Class Win32_LogicalDisk | Format-Table 

wmic logicaldisk get name       #list just logical-drive letters

或者,列出逻辑驱动器信息:FreeSpace、Provider(真实网络位置)、Size 和 VolumeName:

wmic logicaldisk list brief

列出映射的驱动器 - 使用 [DriveInfo] 类:

[System.IO.DriveInfo]::GetDrives()

列出可移动驱动器:

$drives = [System.IO.DriveInfo]::GetDrives()
$r = $drives | Where-Object  $_.DriveType -eq 'Removable' -and $_.IsReady 
if ($r) 
    return @($r)[-1]

查询磁盘容量、空间和卷类型

Invoke-Command -ComputerName S1 Get-PSDrive C | Select-Object PSComputerName,Used,Free 

可用空间:

(Get-PSDrive C).Free

或(以 GB 为单位)

[Math]::Floor(((Get-PSDrive C).Free /[Math]::Pow(2, 30)*10)) /10

已用空间:

(Get-PSDrive C).Used

OR(以 GB 为单位的已用空间)

[Math]::Floor(((Get-PSDrive C).Used /[Math]::Pow(2, 30)*10)) /10

另外查看总空间:(以 GB 为单位)

$totalSpace = ((Get-PSDrive C).Used + (Get-PSDrive C).Free)/(1024*1024*1024)
OR
$totalSpace = ((Get-PSDrive C).Used + (Get-PSDrive C).Free)/[Math]::Pow(2, 30)

四舍五入的值:

[Math]::Floor($totalSpace*10) / 10
OR
[Math]::Round($totalSpace,1)

查询主板信息:

wmic baseboard get product,Manufacturer,version,serialnumber

查询磁盘卷(磁盘分区)信息: Get-Volume 返回有关存储驱动器分区的信息,例如:

Get-Volume                 # All partitions
Get-Volume -DriveLetter C  # Specific partition

#文件系统类型:

Get-Volume -DriveLetter C | select FileSystem
(Get-Volume -DriveLetter C).FileSystem

#分区大小:

Get-Volume -DriveLetter C | select Size
OR (in GB)
[Math]::Floor(((Get-Volume -DriveLetter C).Size/[Math]::Pow(2, 30)*10)) /10

查询内存/查询 RAM

Get-WmiObject Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum
OR (in GB)
$memory = (Get-WmiObject Win32_PhysicalMemory | Measure -Property Capacity -Sum).Sum
$memory = [Math]::Floor(($memory/[Math]::Pow(2, 30)*10)) /10
$memory.ToString() + " gb"

#查询内存,包括频率/速度:

Get-CimInstance win32_physicalmemory | Format-Table Manufacturer,Banklabel,Configuredclockspeed,Devicelocator,Capacity,Serialnumber –autosize

如前所述,这个答案有点超出了所提出的问题,但对于那些想要使用 PowerShell 获得更多操作系统或硬件信息的人来说可能很有用。

【讨论】:

【参考方案30】:
$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
   

【讨论】:

以上是关于如何从 PowerShell 命令行查找 Windows 版本的主要内容,如果未能解决你的问题,请参考以下文章

如何从PowerShell命令行转义管道字符以传递到非PowerShell命令

如何使用Windows命令行环境查找和替换文件中的文本?

Powershell:如何在未连接的计算机上安装适用于 PowerShell 的 Nuget 提供程序,以便可以从 PS 命令行安装 nuget 包?

powershell 如何查找需要使用的命令

powershell 如何查找需要使用的命令

尝试从 powershell 命令行使用 sqlplus 执行 sql 脚本