所以我运行这个命令
$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
答案 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表达式创建计算属性,这些属性基本上可以修改属性的值。为此,请创建一个包含两个项目的Hashtable
:Label
和Expression
。 Label
可以简单地设置为您正在修改的相同属性值。 Expression
是PowerShell ScriptBlock
,它执行某种类型的操作,并返回结果。在上面给出的示例中,我们针对Version
属性运行正则表达式,并将其作为结果返回。
答案 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}