Назад | Перейти на главную страницу

Проблемы Office365 PowerShell с переменными DateTime

У меня есть следующий очень простой фрагмент PowerShell, который просто не работает.

Следующие работы

Get-MessageTrace -StartDate $dateStart -EndDate $dateEnd -PageSize 5000 `
    -SenderAddress system@example.com `
    | where {$_.RecipientAddress -like "*example.com*"} `
    | Select-Object SenderAddress, RecipientAddress, Subject 

Пока следующее не работает

$dateStart = "03/20/2017"
$dateEnd = "03/27/2017"

Get-MessageTrace -StartDate $dateStart -EndDate $dateEnd -PageSize 5000 `
    -SenderAddress system@example.com `
    | where {$_.RecipientAddress -like "*example.com*"} `
    | Select-Object SenderAddress, RecipientAddress, Subject 

Даже если я заменю $dateStart и $dateEnd с различными форматами, такими как MM/dd/yyyy hh:mm:ss.

Ошибок нет, просто результатов не было, но я использовал where шаблоны, которые, как я знаю, должны что-то возвращать. Я также провел вышеупомянутый (пример, который не работает), используя сегодняшнюю дату (которая является значением по умолчанию, когда -startdate и -enddate не указаны), и это тоже не работает. Хотя это то, что эффективно использует рабочий пример.

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

В вашем скрипте вы сейчас используете

$dateStart = "03/20/2017"
$dateEnd = "03/27/2017"

Поскольку в этом случае значения представляют собой строку символов, Windows PowerShell автоматически будет использовать String тип данных для хранения значения, а Get-MessageTrace -StartDate и -EndDate только взять System.DateTime переменные типа.

Вы можете установить переменную правильного типа, используя Get-Date как это:

$dateStart = Get-Date "03/20/2017"
$dateEnd = Get-Date "03/27/2017"

В качестве альтернативы вы можете создать новый System.DateTime объект, указав сначала тип переменной, а затем присвоив ему строковое значение (если это значение, которое можно привести к System.DateTime):

[System.Datetime]$dateStart = "03/20/2017"
[System.Datetime]$dateEnd = "03/27/2017"

Однако я бы предпочел Get-Date поскольку это делает ваш сценарий более универсальным. Например, вы можете создать скрипт, который всегда дает вам информацию за последние семь дней:

$dateEnd = Get-Date
$dateStart = (($$dateEnd).AddDays(-7))

Get-MessageTrace -StartDate $dateStart -EndDate $dateEnd -PageSize 5000 `
    -SenderAddress system@example.com `
    | where {$_.RecipientAddress -like "*example.com*"} `
    | Select-Object SenderAddress, RecipientAddress, Subject 

Дополнительная подсказка:

Вы также можете использовать Get-Date для выяснения краткий формат даты определено в Региональные параметры:

Get-Date -Format d

Это даст вам правильный шаблон короткой даты вам нужно для вашего EndDate и StartDate параметры.