如何提取System.String中的value与localizedValue属性?
如何从System.String中提取'value'和'localizedValue'属性?
问题场景
给定变量:
$Value = "@{value=Microsoft.Management/getEntities/action; localizedValue=List Entities}"
需要提取出value的值:Microsoft.Management/getEntities/action,以及localizedValue的值:List Entities。
当前实现方式:
($Value | Select-Object @{Name="OperationName"; Expression={ForEach-Object{($_ -split "value=")[1]} | ForEach-Object{($_ -split ";")[0]}}}).OperationName
更顺畅的提取方法
方法1:转换为哈希表(推荐)
PowerShell中@{key=value; key2=value2}格式的字符串可直接通过Invoke-Expression转为哈希表,之后能直接通过键名取值:
# 转换为哈希表 $hashTable = Invoke-Expression $Value # 提取value $hashTable.value # 提取localizedValue $hashTable.localizedValue
这种方式直观易读,后续取其他属性只需调用对应键名即可。
方法2:正则表达式匹配
若担心字符串来源不安全、不想用Invoke-Expression,可通过正则精准匹配:
# 提取value $valueMatch = [regex]::Match($Value, 'value=(.*?);').Groups[1].Value # 提取localizedValue $localizedMatch = [regex]::Match($Value, 'localizedValue=(.*)$').Groups[1].Value # 输出结果 $valueMatch $localizedMatch
value=(.*?);匹配value=后到分号前的内容,localizedValue=(.*)$匹配localizedValue=后到字符串结尾的内容,能准确获取目标值。
方法3:简化拆分逻辑
如果保留拆分思路,可简化现有代码,去掉冗余的ForEach-Object:
# 提取value ($Value -split 'value=|;')[1] # 提取localizedValue ($Value -split 'localizedValue=')[1]
通过多次拆分直接定位目标内容,比原代码更简洁。
内容的提问来源于stack exchange,提问作者user3022917
相关产品推荐
相关产品推荐

