PowerShell如何根据当前月份名称筛选指定命名格式的对象
问题排查与修正方案
你的代码存在3个核心错误,外加一个可优化点:
GetMonthName方法要求传入整数类型的月份参数,你额外调用了ToString()将数字月份转为字符串,虽然PowerShell多数时候会自动做隐式类型转换,但属于不规范写法,极端场景下会触发类型不匹配报错- 你构造的
$currentMonth变量仅存储了当前月份名称,完全没有拼接格式要求的年份、Workstations后缀,和目标匹配规则不符 - 过滤时用单引号包裹
$currentMonth变量,PowerShell中单引号包裹的字符串不会解析内部变量,相当于你在匹配字面量字符串$currentMonth,而非变量存储的实际值 - 可优化点:不需要提前执行
Select-Object LocalizedDisplayName,如果后续需要使用软件更新组的其他属性,提前筛选会导致属性丢失,建议过滤完成后再做属性选择
修正后代码
# 构造符合「月份 年份 Workstations」规则的目标名称 $targetSUGName = "{0} {1} Workstations" -f (Get-UICulture).DateTimeFormat.GetMonthName((Get-Date).Month), (Get-Date).Year # 直接过滤匹配的软件更新组 $LatestSUG = Get-CMSoftwareUpdateGroup | Where-Object -Property LocalizedDisplayName -EQ $targetSUGName # 如果你确实只需要保留LocalizedDisplayName属性,可在过滤后再做筛选 # $LatestSUG = $LatestSUG | Select-Object LocalizedDisplayName
如果担心目标名称前后存在多余空格、特殊字符导致精确匹配失败,可以改用模糊匹配逻辑:
$LatestSUG = Get-CMSoftwareUpdateGroup | Where-Object { $_.LocalizedDisplayName -like "*$targetSUGName*" }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

