PowerShell筛选不含指定通配符字符的SAM_ACCOUNT_NAME值问题
解决PowerShell筛选不含指定通配符字符的SAM_ACCOUNT_NAME问题
你的核心问题是用错了运算符:-notcontains是用来判断集合是否包含某个单一值的,不是用来检查字符串里有没有特定字符的。要筛选不包含指定通配符的字符串,应该用正则表达式配合-notmatch运算符。
正确实现步骤
- 定义需要排除的字符集合,转义正则里的特殊字符(
[、]、*在正则里是特殊符号,需要用反斜杠转义) - 用
-notmatch匹配SAM_ACCOUNT_NAME字段,排除包含任意禁止字符的条目 - 可与你的日期筛选条件合并,用
-and连接多条件
完整代码示例
# 定义需要排除的通配符字符,注意正则转义规则 $forbiddenCharsRegex = '[*"\[\]]' # 读取Excel并同时筛选日期和不含禁止字符的SAM账号 $SAMAccounts = Import-Excel -Path "$PSScriptRoot\PulledData.xlsx" | Where-Object { # 日期筛选:匹配当天0点的格式化日期 $_.DT -eq (Get-Date -Hour 0 -Minute 0 -Second 0 -Format 'G') -and # 筛选不包含任何禁止字符的SAM_ACCOUNT_NAME $_.SAM_ACCOUNT_NAME -notmatch $forbiddenCharsRegex }
代码说明
[*"\[\]]:正则字符集,匹配*、"、[、]中的任意一个字符-notmatch:当字符串不匹配正则表达式(即不含任何禁止字符)时,保留该条目- 使用脚本块形式的
Where-Object,更灵活地同时处理日期和字符筛选两个条件
测试验证
针对你提供的示例数据:
SAM_ACCOUNT_NAME DT !@$#* 1/11/2024 User1 1/11/2024
运行代码后,只会保留User1这条符合要求的记录。
内容的提问来源于stack exchange,提问作者Robert Stolle
相关产品推荐
相关产品推荐

