PowerShell中如何按大小写敏感方式筛选属性名称
解决PowerShell大小写敏感筛选PSCustomObject属性名的问题
问题分析
你之前的代码$Aliases |? {$_.PSObject.Properties.Name -match "(?-i)^SMTP"}无法得到预期结果,原因是:
- 当
$Aliases是单个PSCustomObject时,Where-Object中的$_指向整个对象,$_.PSObject.Properties.Name返回的是所有属性名的数组,用-match判断时,只要数组中有任意元素匹配,就会返回整个对象,而非筛选出目标属性。 - 虽然
(?-i)开启了大小写敏感,但结合数组判断逻辑,无法精准定位单个属性。
正确实现方法
1. 提取大小写敏感的SMTP开头属性
直接遍历对象的属性集合,用-cmatch(PowerShell原生大小写敏感匹配运算符)筛选:
# 筛选名称以大写SMTP开头的属性 $smtpProperties = $Aliases.PSObject.Properties | Where-Object { $_.Name -cmatch '^SMTP' } # 获取属性对应的值(如果需要的话) $NewPrimary = $smtpProperties.Value
2. 移除SMTP开头属性,保留剩余内容
如果需要从原对象中移除这些SMTP属性,可通过提取剩余属性名后创建新对象:
# 获取除SMTP开头外的所有属性名 $remainingPropNames = $Aliases.PSObject.Properties.Name | Where-Object { $_ -notcmatch '^SMTP' } # 生成移除SMTP属性后的新对象 $remainingObject = $Aliases | Select-Object -Property $remainingPropNames
适配你的代码场景
替换原代码中$NewPrimary = ...这一行,改成:
# 提取大写SMTP开头的属性值 $NewPrimary = $Aliases.PSObject.Properties | Where-Object { $_.Name -cmatch '^SMTP' } | ForEach-Object { $_.Value }
补充说明
-cmatch是PowerShell专门的大小写敏感匹配运算符,比(?-i)更直观且符合PowerShell语法习惯;- 如果
$Aliases是对象数组,需要先遍历每个对象再处理属性,比如:
$NewPrimaryCollection = $Aliases | ForEach-Object { $_.PSObject.Properties | Where-Object { $_.Name -cmatch '^SMTP' } | ForEach-Object { $_.Value } }
内容的提问来源于stack exchange,提问作者FourK
相关产品推荐
相关产品推荐

