【问题标题】:Regex to extract number from string (gwmi Win32_OperatingSystem).Name正则表达式从字符串中提取数字 (gwmi Win32_OperatingSystem).Name
【发布时间】:2015-11-28 16:44:20
【问题描述】:

我正在使用 (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)?我想过以某种方式限制正则表达式在第一次遇到数字块之后停止处理字符串(即点击一个数字,然后在你点击一个空格时停止),但我不知道如何做这样的事情。或者也许有更好的方法来获取我需要的信息?

提前致谢。

【问题讨论】:

  • 如何分割空间并在数组中获取正确的项目? ((gwmi win32_operatingsystem).name).split(" ")[2]
  • Lieven,效果很好,而且非常简单。如果您不介意我问,[2] 完成了什么?如果您将此作为答案发布,我会相应地标记它。
  • 拆分将字符串变成一个数组(去掉[2])查看全部内容。 [2] 只是数组中的索引。不确定是否将其发布为答案,因为我不确定这对于每个版本的 Windows 来说都是万无一失的。
  • 你是对的。它适用于 7、8 和 10,但在 2012 年返回“服务器”。仍然是一个很好的答案,所以谢谢你的解释。

标签: regex powershell wmi


【解决方案1】:

您应该使用类的 Caption 或 Version 属性,而不是使用 win32_operatingsytem 类的 Name 属性。 查看 win32_operatingsystem 类中这 3 个属性的区别:

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

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

【讨论】:

  • +1 虽然version内核版本。对于 Windows Vista/2008 到 8.1/2012 R2 的所有版本,主要版本将是 6。如果您想要输出 7、10、2012 或 8.1 等,最好解析 Caption 属性。
【解决方案2】:

这会输出“10”:

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

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

\s:一个空格

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

【讨论】:

  • 效果很好!我在 Windows 10、7 和 2012 上尝试过,它给出了正确的输出。你介意我问这是如何工作的吗?您似乎正在选择字符串(.*\s 和 \s.*)中的数字 (\d+)。对吗?
  • 太棒了。因此,让我确保我的理解是正确的。正则表达式找到任何字符,后跟空格,然后是任何长度的数字集,后面有空格,后面有任何字符?像 [asterisk]sdddds[asterisk] 之类的东西?
  • 这是一种表达方式,是的
【解决方案3】:

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

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

然后将正则表达式 -replace 应用于结果字符串:

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

【讨论】:

  • 伟大的建议,马蒂亚斯。这行得通,但 sodawillow 和 Lieven 都给出了更简单的答案。您的回答很有帮助,因为我了解了有关拆分操作的更多信息。感谢您的帮助!
【解决方案4】:

执行此操作的最简单方法之一如下:

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

其工作方式是首先替换HarddiskPartition 之后的所有数据,然后删除所有字母和特殊字符(\|)。

在那之后,我们只剩下数字和点了。

【讨论】:

    【解决方案5】:

    使用 [version] 加速器将 Version 属性中返回的字符串转换为 [System.Version] 对象。这将返回一个对象,其中包含主要、次要、内部版本和修订号的整数表示:

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

    或仅获取主要编号:

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

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 2011-05-10
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多