正则表达式从字符串(gwmi Win32_OperatingSystem).Name中提取数字

时间:2015-11-28 16:44:21

标签: regex powershell wmi

我正在使用(gwmi Win32_OperatingSystem).Name获取操作系统版本,因此配置脚本可以根据该版本选择适当的变量文件。但是,我希望尽可能具体。我想将操作系统版本限制为操作系统编号(即Windows 7为7,Windows 8为8,Windows Server 2012为2012等)。以下是我到目前为止的情况:

(gwmi Win32_OperatingSystem).Name

产生

Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition4

当我尝试用它来限制它只是数字时:

(gwmi Win32_OperatingSystem).Name -replace '\D+(\d+)\D+','$1'

我明白了:

100\Partition4

我需要输出只是“10”。如何调整我的正则表达式语句只选择10(或7或2012)?我想到了以某种方式限制正则表达式在第一次遇到数字块之后停止处理字符串(即击中一个数字,然后当你遇到一个空格时停止),但我不知道如何做这样的事情最模糊。或者也许有更好的方法来获取我需要的信息?

提前致谢。

5 个答案:

答案 0 :(得分:3)

您应该使用类的Caption或Version属性,而不是使用win32_operatingsytem类的Name属性。 请参阅win32_operatingsystem类中这三个属性的区别:

name    : Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk3\Partition1
caption : Microsoft Windows 10 Pro
version : 10.0.10586

解析标题或版本要容易得多。 老实说:我总是选择“版本”,因为它还包含构建编号。

答案 1 :(得分:2)

输出“10”:

'Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition4' -replace '.*\s(\d+)\s.*','$1'

.*:任何字符(.)0次或更多次(*

\s:空格

\d+:一个数字(\d)1次或更多次(+

答案 2 :(得分:2)

首先删除第一个|之后的所有内容,您不需要:

$OSName,$null = (Get-WmiObject Win32_OperatingSystem).Name.Split("|")

然后将regex -replace应用于结果字符串:

$OSVersion = $OSName -replace '\D+(\d+)\D*','$1'

答案 3 :(得分:0)

最简单的方法之一是:

(gwmi Win32_OperatingSystem).Name -replace "(Harddisk.*)|(Partition.*)|([a-z])|(\\)|(\|)|(:)"

这样做的方法是首先替换HarddiskPartition之后的所有数据,接下来我们删除所有字母和特殊字符(\|)。< / p>

之后,我们留下的只是数字和点。

答案 4 :(得分:0)

使用[version]加速器将Version属性中返回的字符串转换为[System.Version]对象。这将返回一个包含Major,Minor,Build和Revision数字的整数表示的对象:

[version](Get-WmiObject -Class Win32_OperatingSystem).Version

或仅获得主要号码:

([version](Get-WmiObject -Class Win32_OperatingSystem).Version).Major