使用PowerShell能否对两种不同CommandType执行过滤?
实现方案
该需求完全可实现,PowerShell原生的-like/-notlike运算符本身就支持*(匹配任意长度任意字符)、?(匹配单个字符)、[a-z](匹配指定范围内字符)等通配符规则,完全满足分别对PSParentPath和Issuer两个字段做关键词过滤的要求。
你当前的硬编码排除规则的写法可以正常运行,但可维护性较差,新增/修改排除规则需要改动过滤逻辑部分,推荐调整为分字段的排除规则数组实现,后续调整规则不需要修改过滤核心代码。
优化后完整实现代码
# 自定义配置区 $DaysBeforeExpiry = 30 # 替换为你实际需要的有效期预警天数 # PSParentPath字段排除规则,支持通配符,新增规则直接加数组元素即可 $parentPathExclusions = @( $Exclusion1, $Exclusion2, $Exclusion3 ) # Issuer字段排除规则,支持通配符,新增规则直接加数组元素即可 $issuerExclusions = @( $Exclusion4, $Exclusion5 ) # 主执行逻辑 $Expiry = Get-ChildItem -Path cert: -Recurse $ExpiryDetails1 = $Expiry | Where-Object { # 有效期校验 $_.NotAfter -le (Get-Date).AddDays($DaysBeforeExpiry) -AND $_.NotAfter -gt (Get-Date) -AND # PSParentPath未匹配任何排除规则,找到第一个匹配项就终止判断,性能更优 $parentPathExclusions.Where({$_.PSParentPath -like $_}, 'First').Count -eq 0 -AND # Issuer未匹配任何排除规则 $issuerExclusions.Where({$_.Issuer -like $_}, 'First').Count -eq 0 } | Select-Object PSParentPath, Issuer, Subject, NotAfter | Format-List
注意事项
- 通配符匹配默认不区分大小写,如果需要区分大小写,将
-like替换为-clike即可 - 如果需要模糊匹配字段中任意位置的关键词,记得在规则前后都加上
*,比如要过滤PSParentPath中包含TestCA的所有项,规则写为*TestCA* - 如果某类字段不需要配置排除规则,给对应的数组留空即可,空数组不会触发过滤逻辑
内容的提问来源于stack exchange,提问作者Ritche Falle
相关产品推荐
相关产品推荐

