You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:05:15