У меня есть следующий очень простой фрагмент кода 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 / дд / гггг чч: мм: сс.
Ошибок нет, просто нет результатов, однако я использовал , где
шаблоны, которые, как я знаю, должны что-то возвращать. Я также выполнил приведенный выше (пример, который не работает), используя сегодняшнюю дату (которая является значением по умолчанию, когда -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
параметров.