在powershell中解析一个值

时间:2014-06-04 14:52:12

标签: parsing powershell

所以我运行这个命令

$driverRAIDv = $data|where-object{$_.Name -eq "$serverName" -and ($_.Description1 -match "hpsa")} | select -ExpandProperty version

并返回此值:

HP HPSA Driver (v 5.0.0-28OEM)

我想获取此值/变量并对其进行解析,以便我只有5.0.0-28OEM

4 个答案:

答案 0 :(得分:1)

试一试。基本上,我们正在创建一个"计算的属性"包含一个表达式来解析出你想要的值部分。

$driverRAIDv = $data|where-object{$_.Name -eq "$serverName" -and ($_.Description1 -match "hpsa")} | select -Property @{ Label = 'Version'; Expression = { [void]($_ -match ('v\s(.*?)\)')); $matches[1]; }; };

我使用以下代码对其进行了测试:

@{ Version = 'HP HPSA Driver (v 5.0.0-28OEM)'} | select -Property @{ Label = 'Version'; Expression = { [void]($_ -match ('v\s(.*?)\)')); $matches[1]; }; };

如果查看Select-Object命令的帮助,您将看到可以通过PowerShell表达式创建计算属性,这些属性基本上可以修改属性的值。为此,请创建一个包含两个项目的HashtableLabelExpressionLabel可以简单地设置为您正在修改的相同属性值。 Expression是PowerShell ScriptBlock,它执行某种类型的操作,并返回结果。在上面给出的示例中,我们针对Version属性运行正则表达式,并将其作为结果返回。

enter image description here

答案 1 :(得分:1)

试试这个,匹配()括号之间的任何内容:

编辑:..并删除v后跟空格:

$driverRAIDv = $data|where-object{$_.Name -eq "$serverName" -and ($_.Description1 -match "hpsa")} | select -ExpandProperty version
$regex = "(?<=\().*(?=\))"
[regex]::matches($driverRAIDv,$regex).Value -replace "v "

返回:

5.0.0-28OEM

或者您可以使用以下正则表达式来匹配(v)

之间的任何内容
$regex="(?<=\(v\s).*(?=\))"

答案 2 :(得分:0)

根据您的需求和您将得到的变化,您有很多方法可以做到这一点。

一种方法是使用替换运算符。说,你有

$driverRAIDv="HP HPSA Driver (v 5.0.0-28OEM)"
$driverRAIDv -replace 'HP HPSA Driver \(v ','' -replace '\)',''

会得到5.0.0-28OEM

在同一行:

$driverRAIDv = ($data|where-object{$_.Name -eq "$serverName" -and ($_.Description1 -match "hpsa")} | select -ExpandProperty version) -replace 'HP HPSA Driver \(v ','' -replace '\)',''

答案 3 :(得分:0)

非正则表达式选项是在()(空格)上拆分,并选择最后一个非空字符串。

$driverRAIDv = $data|
    where {$_.Name -eq $serverName -and $_.Description1 -match "hpsa"} |
    foreach {$_.version.split('[() ]')| where {$_}| select -last 1}