Search-Mailbox SearchQuery не работает
Я пытаюсь удалить содержимое почтового ящика Exchange 2013 до сегодняшней даты. Это должно быть конкретно для второго я называю Get-Date
Командлет.
Этот код работает без ошибок:
Search-Mailbox myID -SearchQuery Received:<Get-Date -DeleteContent -Force
При выполнении этого я вижу индикатор выполнения поиска в PowerShell, за исключением того, что данные не найдены. Я трижды проверил почтовый ящик, с которым я работаю, и в нем есть данные старше 4/24/14/ чч: мм: сс.
Я пробовал бесчисленное множество вариантов, например:
Search-Mailbox whism_j -SearchQuery "Received:<$((Get-Date).ToString("yyyy-MM-ddTHH:mm:ssZ"))" -DeleteContent -Force`
Эта команда не выполняется, так как я получаю The property keyword isn't supported
ошибка.
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, чтобы определить правильную строку формата, и укажите это для параметра -FormatGet-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
это просто текущая дата без времени.
Это был лучший результат, когда я пытался выполнить поиск по диапазону дат в Office 365 ( Exchange Online). При добавлении SearchQuery для поиска электронной почты старше даты я получал ResultItemsCount 0.
Итак, вот что я в итоге нашел методом проб и ошибок:
Рекомендую использовать формат ISO-dash-not-slash: гггг-мм-дд
ДЕЙСТВИТЕЛЬНЫЕ поиски:
-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!
Я использую этот формат, и он отлично работает -SearchQuery "Получено:> $('22/09/2014 02:15:00') И получено:<$ ('22/09/2014 03:15:00')"
Так что это должно работать: Search-Mailbox whism_j -SearchQuery "Получено:> $('22/09/2014 02:15:00') И получено:<$ ('22/09/2014 03:15:00')" -deleteContent
Если вы хотите выполнить поиск в диапазоне дат без указания второго, это намного проще: Search-Mailbox whism_j -SearchQuery "Получено:20/09/2014. 23/09/2014" -deleteContent
Кроме того, у меня есть проблема с созданием Search-Mailbox с SearchQuery, и он не находит никаких результатов, но Search-Mailbox без NO SearchQuery показывает сообщение. Есть две вещи, которые нужно проверить. Сначала переместите базу данных на другой сервер, затем подождите (минуты / часы / день?), А затем повторите поиск. Обычно я могу найти сообщение. Далее следует проверить, действительно ли он проиндексирован этой командой. Get-FailedContentIndexDocuments test@test.com | где {$_.subject -match "некоторые слова"} |ft Subject, Description -AutoSize
Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что ваша строка даты содержит пробелы, поэтому она интерпретирует ее как еще одно свойство для фильтрации. Итак, он читает:
"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. Со страницы Microsoft MSDN:
Все значения даты / времени должны быть указаны в соответствии с UTC (Всемирное координированное время), также известным как часовой пояс GMT (время по Гринвичу). Идентификатор часового пояса UTC (завершающий символ "Z") является необязательным.