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

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

我该怎么做?

588751 次浏览

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

比如说,

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


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

可以找到 Windows 版本的详细信息 给你

  1. 要获得 Windows 版本号,正如 Jeff 在他的 回答中指出的那样,使用:

    [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
    

    将返回类似于

    MicrosoftWindowsServer2008标准

用途:

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

如果你想区分 Windows 8.1(6.3.9600)和 Windows 8(6.2.9200) ,请使用

(Get-CimInstance Win32_OperatingSystem).Version

[Environment]::OSVersion在 Windows 8.1中不能正常工作(它返回 Windows 8版本)。

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

这将给你 Windows 的完整版本(包括版本/版本号)不同于以上所有的解决方案:

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

结果:

10.0.10240.16392 (th1_st1.150716-1608)

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
$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
}
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name 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"
}
}

我正在改进其中一个 答案

我在试图匹配 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 }

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

Windows10有自己的 < em > 版本 : 1507、1511、1607、1703等

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]:...

同一命令的 Windows10输出:

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

如果你试图破译信息 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

从 PowerShell 5开始:

Get-ComputerInfo
Get-ComputerInfo -Property Windows*

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

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

我把上面的脚本稍微调整了一下,得出了这样的结论:

$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 Build: 16299.431@{ WindowsInstallDateFromRegistry = 18-01-012:29:11 AM }

提示: 我希望手工剥离前缀文本从安装日期,这样我可以替换为一个更可读的标题。

Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

报税表

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

您可以使用 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

使用 Windows PowerShell,你可以通过以下方式获得所需的数据

描述:

(Get-WmiObject -class Win32_OperatingSystem).Caption

发行:

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

版本:

(Get-CimInstance Win32_OperatingSystem).version

要在 Windows 101809的 PowerShell v5中生成与 winver.exe 相同的输出:

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

[解决]

#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-----------------#

这确实是一条长线,可能是因为尽管答案是正确的,但并没有解决根本问题。 我偶然发现了这个网站: 版本及编译编号,它提供了一个清晰的概述,什么是什么在微软的 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

注意: 正如你所看到的,我只在服务器系统上使用了上面的代码,但是它可以很容易地应用到工作站上,甚至可以聪明地扩展到同时支持两者... ... 但是我还是把它留给你。

玩得开心!

您也可以使用类似的东西,通过检查 OSVersion。版本。主要:

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

应该很简单:

Get-ComputerInfo  | select windowsversion

已安装的 Client.OS.rs2.amd64版本 “为 Win 10客户端”

MicrosoftWindowsNT CurrentVersion 更新 TargetingInfo 安装的 Server.OS.amd64版本 “服务器操作系统”

(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Update\TargetingInfo\Installed\Client.OS.rs2.amd64').version

基于 Tim 之前的回答,这个特定位置的好处是,属性已经处于我称之为首选格式的位置。

我只是想完成一个小剧本。我们使用了之前已经回答过的开关版本,只是详细阐述了一下。没有一个地方可以给你我们习以为常的友好的名字。Windows101909或 Windows1020H2。所以我们必须手动编程。

$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代替

如果你想要一个例子,我可以稍后提供 如果您使用 Windows2003R2或更早. . 停止移动到一个新的操作系统。

在 Powershell 提示符或 cmd 提示符窗口的 C: 提示符处的 systeminfo 给出 OS 名称版本配置制造商和更多..。

你们太努力了。这个工作与您的本地或远程会话使用 Enter-PSSsession-给它一个尝试。

你只需要输入:

cmd ?


Microsoft Windows [ Version 10.0.19042.1237]

相当于 Winver 的 Powershell

适用于所有版本的 Windows10,直到20h2,速度快,而不是 也是复杂 *

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在“ Version”旁边显示的内容。

我没有想到要阅读这么多才能得出这个代码,我真的希望我不必为了22h1(或者不管当时的名字是什么)而调整它。


* : 微软肯定让它变得比应该的更复杂

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

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

查询一般操作系统资料:

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

cmd ?

# 使用 Get-ComputerInfo:

Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer

# 使用 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 <your_ip_address>) ,您将在第一行看到您的“ hostname”。

查询电流(已登入)用户:

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,and 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

OR (以 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                 # 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 获得更多操作系统或硬件信息的人来说可能很有用。