使用Search-Mailbox时SearchQuery的AND与OR逻辑异常问题排查
你的查询确实存在几个KQL语法和PowerShell命令格式的问题,导致匹配结果不符合预期,我来逐一拆解:
1. PowerShell换行转义的致命错误
你在命令里用反引号`换行,但反引号后面绝对不能有空格!看你的原命令:
Search-Mailbox -Identity $User ` -SearchQuery "..." ` -LogOnly ...
这里-SearchQuery前面的反引号后面跟着空格,PowerShell会把这个反引号当成普通字符,而非换行符,直接导致-SearchQuery`的参数值被错误解析——KQL查询字符串的逻辑被截断,部分条件被忽略,最终出现你看到的“OR逻辑生效”的假象。
修复:把反引号后面的空格删掉,确保反引号是每行的最后一个字符:
Search-Mailbox -Identity $User ` -SearchQuery "Attachment:p* AND From:$email AND To:reception@contoso.com AND Received<`"2018-02-04`" AND Subject:(GfC* OR G4C* OR c4g*)" ` -LogOnly -TargetMailbox "myusername" -TargetFolder "SearchAndDeleteLog" -LogLevel Full
2. Attachment字段的用法误解
你用Attachment:p*是想匹配“有附件”的邮件吗?如果是,这个写法完全错误:
Attachment:p*的作用是匹配附件文件名以p开头的邮件,没有附件或附件文件名不以p开头的邮件都不会满足这个条件;- 如果你的真实需求是“存在任意附件”,应该替换成
HasAttachment:true。
如果确实要找文件名以p开头的附件,那这个写法没问题,跳过这一步即可。
3. Subject条件的冗余优化
你写的Subject:(GfC* OR G4C* OR c4g* OR GfC OR G4C OR c4g)里,GfC已经被GfC*包含了(通配符*匹配0或多个字符,精确的GfC会被GfC*命中),同理G4C和c4g都是冗余的,可以简化成:
Subject:(GfC* OR G4C* OR c4g*)
4. 日期格式的潜在坑
你用的Received<"04/02/2018"依赖系统区域设置,比如美式是4月2日,英式是2月4日,很容易出现日期解析错误。建议改用ISO 8601格式(yyyy-MM-dd),比如:
Received<`"2018-02-04`"
这样无论系统区域如何,日期都会被正确解析。
修复后的完整命令
假设你的需求是“有附件、指定发件人/收件人、2018年2月4日前收到、主题以GfC/G4C/c4g开头”,修复后的命令如下:
Search-Mailbox -Identity $User ` -SearchQuery "HasAttachment:true AND From:$email AND To:reception@contoso.com AND Received<`"2018-02-04`" AND Subject:(GfC* OR G4C* OR c4g*)" ` -LogOnly -TargetMailbox "myusername" -TargetFolder "SearchAndDeleteLog" -LogLevel Full
如果你的需求确实是附件文件名以p开头,把HasAttachment:true换回Attachment:p*即可。
内容的提问来源于stack exchange,提问作者Jack T. Rades

