Search-Mailbox SearchQuery не работает

Я пытаюсь удалить содержимое почтового ящика Exchange 2013 до сегодняшней даты. Это должно быть специфично для второго командлета, который я вызываю Get-Date.

Этот код работает без ошибок:

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

При выполнении этого я вижу индикатор выполнения поиска в PowerShell, за исключением того, что данные не найдены. Я трижды проверил почтовый ящик, с которым работаю, и в нем есть данные старше 24.04.14/чч:мм:сс.


Я пробовал бесчисленное количество вариантов, например:

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

Эта команда не выполняется, так как я получаю ошибку The property keyword isn't supported.


person Johnrad    schedule 24.04.2014    source источник


Ответы (4)


Почему ваш код не работает:

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

Это не работает, потому что get-date анализируется как литеральная строка; вы не интерполируете результаты командлета Get-Date. -SearchQuery — это строковый параметр, и PowerShell неявно интерпретирует аргументы строковых параметров как строки в двойных кавычках. Чтобы интерполировать результаты Get-Date, используйте -SearchQuery Received:<$(Get-Date).

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

Это не работает, потому что формат даты недействителен. Вы можете сделать вывод, что он должен основываться на документации AQS, но в на самом деле дата в запросах Search-Mailbox должна быть в формате, соответствующем региональным настройкам сервера Exchange.

Как это сделать:

Вы можете обойтись простой интерполяцией результатов Get-Date:

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

Однако это будет работать только в том случае, если формат, используемый при интерполяции объекта DateTime в строку (то есть MM/dd/yyyy HH:mm:ss), соответствует региональному формату. Чтобы убедиться, что вы получаете правильный формат, используйте Get-Culture, чтобы определить правильную строку формата, и укажите ее в -Format Get-Date. параметр:

Если вы хотите использовать сегодняшнюю дату, вы можете использовать Get-Date, а затем преобразовать ее в строку, как предложил RickH, но это не обязательно, поскольку AQS поддерживает именованные относительные даты. , в том числе сегодня:

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

Обратите внимание, что, как следует из того, что я сказал выше, внешние двойные кавычки не являются строго обязательными, если аргумент не содержит пробелов, которые не находятся в круглых скобках, но я думаю, что их использование является хорошей практикой.


Для полноты картины и в интересах будущих искателей стоит упомянуть, что AQS также принимает именованные относительные даты, такие как today, this week или last month, поэтому это также должно работать:

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

Я не предоставил это как часть ответа, потому что в предыдущей (удаленной) версии вопроса ОП специально спрашивал, как искать в сообщениях до точного времени, а today - это просто текущая дата без времени.

person Adi Inbar    schedule 24.04.2014
comment
Я ценю ваш ответ! Search-Mailbox id_attribute -SearchQuery "Received:<$(Get-Date)" -DeleteContent -Force это дает мне ту же самую старую ошибку ключевого слова и не работает. Search-Mailbox whism_j -SearchQuery "Received:<$(Get-Date -Format ((Get-culture).DateTimeFormat.ShortDatePattern))" -DeleteContent -Force выполняется успешно, но не находит данных. Кажется, когда я, наконец, успешно запускаю что-то, данные не создаются. - person Johnrad; 24.04.2014
comment
На данный момент я пришел к выводу, что ему не нравится добавлять время к дате. Search-Mailbox whism_j -SearchQuery "Received:<$(get-date -Format d)" -DeleteContent -Force это работает (по-прежнему ничего не возвращает). Поиск get-date -format G не работает. Выдает ошибку ключевого слова. - person Johnrad; 24.04.2014
comment
1. Попробуйте ввести "Received:<$(Get-Date -Format ((Get-culture).DateTimeFormat.ShortDatePattern))" в самой подсказке и сообщите мне, какие результаты вы получите. 2. Что произойдет, если вы попробуете отправить вместо полученного? 3. Что вы имеете в виду, когда говорите, что данные не создаются или ничего не возвращаются? Вы имеете в виду, что вы получаете ResultItemsCount 0 или вообще никаких результатов? Последнего не должно быть — вы должны получить отчет о результатах, даже если ничего не найдено. - person Adi Inbar; 24.04.2014
comment
Это может показаться глупым вопросом, но не помешает спросить... если это первое, вы на 1000% уверены, что есть данные в почтовом ящике? Если вы используете -DeleteContent, вы получите положительный счетчик элементов только в первый раз и 0 после этого, если не будут добавлены новые элементы. Вы проверяли почтовый ящик, чтобы убедиться, что в нем все еще есть данные, полученные до сегодняшнего дня? Возможно, вы не заметили, что команда успешно выполняется один раз, и поэтому она не находит больше ничего для удаления. - person Adi Inbar; 24.04.2014
comment
Опять же, ваша помощь потрясающая, спасибо. Не глупый вопрос, у меня в этом тестовом почтовом ящике 7 предметов, которые были отправлены туда сегодня днем. Когда я просто запускаю -deleteContent, я получаю положительный результат ResultItemCount. Я повторно заполнил почтовый ящик этого почтового ящика. При попытке добавить SearchQuery мои ResultItemsCount и ResultItemsSize равны 0. Это то, что я имею в виду под отсутствием данных. Если это сделает его немного проще, когда я запускаю get-culture, LCID равно 1033, «Имя» равно en-US, а DisplayName равно English (United States). - person Johnrad; 24.04.2014
comment
Кроме того, чтобы ответить на ваш предыдущий вопрос. Когда я запускаю "Received:<$(Get-Date -Format ((Get-culture).DateTimeFormat.ShortDatePattern)), я снова получаю 0 resultItemsCount. Это может быть глупый вопрос, но в чем разница между sent и received. - person Johnrad; 24.04.2014
comment
К сожалению, в настоящее время у меня нет доступа к серверу Exchange. Можно ли искать что-либо, что дает результат, а затем ссылаться на формат даты/времени, отправленный вам сервером? Затем найдите это, и если вы накормите его тем, что он вам дает, и он по-прежнему говорит 0 результатов, тогда мне интересно, есть ли где-то другие проблемы. - person TheMadTechnician; 25.04.2014
comment
Я могу выполнить поиск по теме и удалить контент. При регистрации я вижу, что мой формат даты такой же, как 2/5/2014 9:48:35 PM - person Johnrad; 25.04.2014
comment
@Johnrad Если культура en-US, то вы должны иметь возможность просто интерполировать $(Get-Date) без указания формата (это должно было сделать поиск универсальным; хотя это не должно вредить< /i> для включения формата, даже если язык и региональные параметры — en-US). Также обратите внимание, что я изменил его на LongDatePattern, так как в вашем примере есть секунды. - person Adi Inbar; 25.04.2014
comment
Отправлено — это время, когда сообщение было принято почтовым сервером отправителя от клиента отправителя. Получено — время, когда сообщение было доставлено в почтовый ящик получателя. Это предложение было для диагностических целей. Received absolute должен быть действительным свойством, но, поскольку вы получали ошибку property keyword isn't supported, я подумал, что, возможно, стоит посмотреть, что произойдет, если вы выполните поиск по другому свойству даты и времени. - person Adi Inbar; 25.04.2014
comment
Новое интересное развитие... Если я уберу знак < из своего запроса, я найду все элементы с сегодняшней даты, и он их удалит. Однако он не соответствует формату ЧЧ:мм:сс... Это лучше, чем раньше. Но не то, что я хочу - person Johnrad; 25.04.2014
comment
@Johnrad Вы говорите, что повторно заполнили папку «Входящие». Вы делаете это, отправляя новые элементы, или вы перемещаете в него старые элементы? Если вы отправляете элемент, даже если вы пересылаете старое электронное письмо, дата получения будет сегодня. Если у вас есть старые элементы, что произойдет, если вы воспользуетесь этим запросом: Received:>1/1/1601? Это должно удалить все. - person Adi Inbar; 25.04.2014
comment
Я физически отправляю в почтовый ящик новую почту, когда заново ее заполняю. Received:>1/1/1601 ничего не удалял. Я попробовал Received:4/25/2014, и он удалил все элементы, которые я отправил ему сегодня... - person Johnrad; 25.04.2014
comment
Дата в вашей системе правильная? Еще не 25.04.2014, если только вы не находитесь в Восточной Азии или дальше на восток, и похоже, вы говорите, что удаленные элементы, отправленные ранее сегодня... - person Adi Inbar; 25.04.2014
comment
Спасибо за помощь. Я собираюсь сделать это как правильный ответ, чтобы вы получили признание за помощь, которую вы мне оказали. Я думаю, что мне придется сократить свои потери и искать другую альтернативу. Это просто не примет ничего с символом меньше для меня. Судя по всему интернету, так и должно быть. Это как-то связано с e2k13? - person Johnrad; 25.04.2014
comment
@Johnrad Мои серверы Exchange — 2K10, поэтому, возможно, в 2K13 есть какая-то ошибка, которую я не могу воспроизвести. Вы установили недавно выпущенный SP1? Кроме того, я погуглил, чтобы узнать, есть ли известные проблемы с поиском в Ex2K13, и нашел это. Ссылки в первом ответе могут быть полезны для определения/устранения проблемы, хотя то, что там описано, звучит так, будто это может быть больше проблем, чем того стоит. - person Adi Inbar; 25.04.2014
comment
Кстати... поскольку вы говорите, что ищете альтернативные решения, если ваша цель — всегда удалять сообщения старше одного дня (а не делать это только в определенное время), рассматривали ли вы политики хранения? По умолчанию они запускаются только один раз в день, но вы можете изменить частоту (хотя, вероятно, для производительности сервера будет нехорошо запускать их каждую минуту...). Существует также онлайн-архивирование (на стороне сервера), хотя они заставляют вас покупать специальные лицензии для этого, и у меня нет опыта работы с ним, поэтому я не могу сказать вам, может ли оно делать то, что вам нужно. - person Adi Inbar; 26.04.2014

Это был лучший результат, когда я пытался выполнить поиск диапазона дат в Office 365 (Exchange Online). Добавив SearchQuery для поиска электронной почты старше даты, я получил ResultItemsCount 0.

Итак, вот что я в итоге нашел методом проб и ошибок:

Рекомендуется использовать формат ISO тире без косой черты: гггг-мм-дд.

ДЕЙСТВИТЕЛЬНЫЕ поиски:

-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

СЛОМАННЫЕ поиски:

-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!
person WhoIsRich    schedule 12.05.2017
comment
Странно, но запросы с :‹ иногда возвращают некоторые данные. Нажмите на этот пост, когда ищете, почему мои запросы не работают, и есть запрос типа Received:>"2018-01-01", возвращающий мне несколько сообщений. Не уверен по причине, но это означает, что MS проделала большую работу, скрывая детали синтаксического анализатора KQL. Проголосовал за действительные примеры. - person Vesper; 01.06.2018

Я думаю, что проблема, которую вы видите, заключается в том, что в вашей строке даты есть пробелы, поэтому она интерпретирует ее как еще одно свойство для фильтрации. Итак, он читает:

"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 — это табуляция, но это просто переводится как буква «T». Кроме того, в кавычках заключен только элемент для поиска, а не все. Обновленный ответ. Exchange должен увидеть запрос как:

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

Смещение часового пояса является необязательным, так как все время должно быть в формате UTC. С страницы MSDN Microsoft:

Все значения даты/времени должны быть указаны в соответствии с часовым поясом UTC (всемирное координированное время), также известным как часовой пояс GMT (среднее время по Гринвичу). Идентификатор часового пояса UTC (знак «Z» в конце) является необязательным.

person TheMadTechnician    schedule 24.04.2014
comment
С этим я получаю еще один the property keyword isn't supported. Я полностью понимаю, о чем вы говорите, но не знаю, почему я так часто вижу эту ошибку. Я даже не могу указать конкретную дату, например, 24.04.2014. - person Johnrad; 24.04.2014
comment
По какой-то причине мне не нравится, когда я добавляю дату и время... Received:<"2014-04-24T10:51:23" выдает ошибку ключевого слова. Когда я удаляю чч:мм:сс и просто использую Received:<"2014-04-24", он работает успешно, но на самом деле ничего не возвращает. - person Johnrad; 24.04.2014
comment
На самом деле пробелы не проблема. AQS кажется довольно умным в том, как он анализирует запросы, и из того, что я видел, только пробел, за которым следует последовательность букв, за которой следует :, интерпретируется как новое свойство. Однако я обнаружил, что Search-Mailbox не поддерживает форматы даты ISO-8601 и требует формат, соответствующий региональным настройкам. У меня нет проблем с поиском по таким запросам, как -SearchQuery "Received:<24/04/2014 15:09:37 kind:Email". - person Adi Inbar; 24.04.2014
comment
Чтобы уточнить это, сообщение об ошибке, опубликованное OP, The property keyword isn't supported, действительно, похоже, подразумевает, что PowerShell интерпретирует что-то как недопустимое имя свойства; ошибка, которую я получаю для недопустимых форматов даты, это Please adjust the date time. Make sure it is in the correct format. или There is an unexpected character in the query. Please re-type the query and try again. Однако он, вероятно, перепробовал так много вещей, что мне интересно, мог ли он перепутать, какое сообщение об ошибке было для какой команды. С его кодом я получаю непредвиденную ошибку символа. - person Adi Inbar; 24.04.2014
comment
@AdiInbar Я никогда не получал никаких ошибок, кроме ошибки ключевого слова свойства. Но вы правы, я пробовал десятки разных решений. Без searchQuery я могу удалить весь контент, при добавлении searchQuery я ничего не получаю. - person Johnrad; 24.04.2014
comment
@AdiInbar Хм, в документации сказано, что строка не должна содержать пробелов. (что спорно, поскольку буква T интерпретируется буквально, а не пробел, как я думал изначально) - person TheMadTechnician; 24.04.2014
comment
Я не совсем уверен, что searchQuery примет время в часах, минутах и ​​секундах. Как отформатировано в вашем ответе, ему это не нравится. Если я переформатирую дату получения на yyyy/MM/ddTHHmmss, даже если это выглядит глупо, это действительно сработает. Я не думаю, что ему нравится двоеточие. В любом случае, когда я просто ищу по yyyy/MM/dd даже, никаких результатов не найдено, когда я фактически вижу 7 объектов, которые он должен удалить в почтовом ящике. - person Johnrad; 24.04.2014
comment
@TheMadTechnician Правильно, в документации сказано, что строка не должна содержать пробелов. Однако тип данных для свойства Received — это не строка, а абсолютная дата. Абсолютные даты имеют пробел между датой и временем (если вы указываете время). - person Adi Inbar; 25.04.2014

Я использую этот формат, и он работает нормально -SearchQuery "Получено:> $('22/09/2014 02:15:00') AND Получено:‹ $('22/09/2014 03:15:00')"

Так что это должно работать: Search-Mailbox whism_j -SearchQuery "Received:> $('22/09/2014 02:15:00') AND Received:‹ $('22/09/2014 03:15:00')" -deleteContent

Если вы хотите выполнить поиск в диапазоне дат, не привязываясь ко второму, это намного проще: Search-Mailbox whism_j -SearchQuery "Received:20/09/2014..23/09/2014" -deleteContent

Кроме того, у меня проблема с выполнением Search-Mailbox с SearchQuery, и он не находит никаких результатов, но Search-Mailbox без SearchQuery показывает сообщение. Есть две вещи, которые, кажется, работают. Сначала переместите базу данных на другой сервер, затем подождите (минуты/часы/день?), а затем снова выполните поиск. Обычно я могу найти сообщение. Далее нужно проверить, действительно ли он проиндексирован, с помощью этой команды Get-FailedContentIndexDocuments [email protected] | где {$_.subject -соответствие "некоторым словам"} |ft Тема, Описание -Авторазмер

person Ryan    schedule 23.09.2014