Search-Mailbox SearchQuery无法正常工作

时间:2014-04-24 15:38:55

标签: powershell exchange-server exchange-management-shell

我正在尝试在今天的日期之前删除Exchange 2013邮箱的内容。它必须特定于我调用Get-Date cmdlet的第二个。

此代码运行时没有错误:

Search-Mailbox myID -SearchQuery Received:<Get-Date -DeleteContent -Force

执行此操作时,我在PowerShell中看到了搜索进度条,但未找到任何数据。我已经对我正在使用的邮箱进行了三次检查,其数据大于4/24/14 / hh:mm:ss。


我尝试了无数变种,例如:

Search-Mailbox whism_j -SearchQuery "Received:<$((Get-Date).ToString("yyyy-MM-ddTHH:mm:ssZ"))" -DeleteContent -Force`

此命令无法执行,因为我收到The property keyword isn't supported错误。

4 个答案:

答案 0 :(得分:2)

为什么您的代码无效:

Search-Mailbox myID -SearchQuery Received:<get-date -deleteContent -force

这不起作用,因为get-date被解析为文字字符串;您没有插入 Get-Date cmdlet的结果。 -SearchQuery 是一个字符串参数,PowerShell隐式将字符串参数的参数解释为双引号字符串。要插入获取日期的结果,请使用-SearchQuery Received:<$(Get-Date)

Search-Mailbox whism_j -SearchQuery "Received:<$((get-date).toString("yyyy-MM-ddTHH:mm:ssZ"))" -deleteContent -force

这不起作用,因为日期格式无效。您可能会推断它应该基于AQS documentation,但实际上 Search-Mailbox 查询中的日期必须采用符合Exchange服务器区域设置的格式。

怎么做:

可能能够通过简单地插入获取日期的结果来逃脱:

Search-Mailbox id_attribute -SearchQuery "Received:<$(Get-Date)" -DeleteContent -Force

但是,只有将DateTime对象插入到字符串MM/dd/yyyy HH:mm:ss中时使用的格式与区域格式匹配时,此方法才有效。为确保您获得正确的格式,请使用获取文化来确定正确的格式字符串,并将其提供给获取日期 -Format 参数:

如果您想使用今天的日期,可以使用获取日期,然后将其转换为RickH建议的字符串,但这不是必需的,因为AQS支持命名相对日期,包括今天

$format = (Get-Culture).DateTimeFormat.ShortDatePattern + ' ' + (Get-Culture).DateTimeFormat.LongTimePattern
Search-Mailbox myID -SearchQuery "Received:<$(Get-Date -Format $format)" -DeleteContent -Force

请注意,正如我上面所说的那样,如果参数不包含不在括号内的空格,则外部双引号不是绝对必要的,但我认为包含它们是一种好习惯


为了完整性和未来搜索者的利益,值得一提的是,AQS也接受命名的相对日期,例如todaythis weeklast month,因此这也应该有效:< / p>

Search-Mailbox id_attribute -SearchQuery "Received:<today" -DeleteContent -Force

我没有将其作为答案的一部分提供,因为在问题的先前(已删除)版本中,OP专门询问了如何在确切时间之前搜索消息,而today只是当前日期没有时间。

答案 1 :(得分:2)

当我尝试在Office 365(Exchange Online)上进行日期范围搜索时,这是最佳结果 添加SearchQuery以查找比日期更早的电子邮件,我得到了ResultItemsCount 0。

所以这是我最终通过反复试验找到的:

建议使用ISO dash-not-slash格式:yyyy-mm-dd

VALID搜索:

-SearchQuery Sent:2016-01-01..2018-01-01
-SearchQuery Sent<2016-01-01
-SearchQuery Sent<=2016-01-01

-SearchQuery "Received>=2016-01-01 AND Received<=2018-01-01"
-SearchQuery Received<2016-01-01
-SearchQuery Received<=2016-01-01

BROKEN搜索:

-SearchQuery Received:2016-01-01..2018-01-01  #This style range only valid for Sent.
-SearchQuery Sent:<2016-01-01                 #Putting a : colon before < > less or greater than returns nothing.
-SearchQuery Recieved<2016-01-01              #i before e except after c, no errors for mispelt properties!

答案 2 :(得分:1)

我认为你看到的问题是你的日期字符串中有空格,所以它将它解释为另一个要过滤的属性。所以它正在阅读:

"Received:<$((get-date).tostring("yyyy-MM-ddTHH:mm:ssZ"))"

扩展为类似:

"Received:<2014-04-24 10:51:23-08"

我相信这里有两个属性Received:10:,因为您的日期并未用双引号括起来。这应该适合你:

Search-Mailbox whism_j -SearchQuery Received:<"$((get-date -f "yyyy-MM-ddTHH:mm:ss").tostring())" -deleteContent -force

编辑:抱歉,我的错误,出于某种原因,我认为T是一个标签,但它只是翻译成字母&#34; T&#34;。此外,只需要搜索的项目用引号括起来,而不是整个内容。更新的答案。 Exchange应将查询视为:

Received:<"2014-04-24T10:51:23"

时区偏移是可选的,因为所有时间都应该是UTC。来自Microsoft's MSDN page

  

必须根据UTC(协调世界时)(也称为GMT(格林威治标准时间))时区指定所有日期/时间值。 UTC时区标识符(尾随&#34; Z&#34;字符)是可选的。

答案 3 :(得分:1)

我使用这种格式,它工作正常 -SearchQuery&#34;收到:&gt; $('22/09/2014 02:15:00')并收到:&lt; $('22/09/2014 03:15:00')&#34;

所以这应该有效: Search-Mailbox whism_j -SearchQuery&#34;收到:&gt; $('22/09/2014 02:15:00')并收到:&lt; $('22/09/2014 03:15:00')&#34; -deletecontent

如果您想要搜索日期范围而不是特定于第二个,则更容易: Search-Mailbox whism_j -SearchQuery&#34;收到:20/09 / 2014..23 / 09/2014&#34; -deletecontent

此外,我遇到使用SearchQuery执行Search-Mailbox的问题,但它没有找到任何结果,但是没有SearchQuery的Search-Mailbox会显示该消息。 有两件事要检查似乎有效。 首先,将数据库移动到另一台服务器,然后等待(几分钟/小时/天?)然后再次搜索。通常我都能找到这条消息。 接下来是检查它是否实际使用此命令编入索引 Get-FailedContentIndexDocuments test@test.com |其中{$ _。subject -match&#34; some words&#34;} | ft主题,描述-AutoSize