Да, вы можете проверить, что строка содержит дату, используя ‘(-as [DateTime])’. Проблема в моем оригинальном скрипте состоит в том, что я предполагал, что входные параметры скрипта являются строками. По-видимому, числовой параметр автоматически преобразуется в целое число, если он не набирается в кавычках. Итак, я должен был написать
if ([string]$date -as [DateTime])
принудительное преобразование возможного числа обратно в строку, как это делает Кит в своем ответе.
Тот же недостаток применим к моей проверке целых чисел. Сценарий завершается неудачно, если задано «3 октября» (без кавычек). PS создает массив здесь?
Почему при успешной проверке происходит сбой анализа? Йоханнес объяснил это. Выражение
$date -as [DateTime]
указывает PS преобразовать ввод в дату. Преобразование числа имеет смысл (дата 1 - 01 января 0001 г.), поэтому оно не завершается ошибкой, когда ему присваивается число. Выражение
[DateTime]::Parse($date)
специально разбирает строку, поэтому указание целого числа не имеет смысла и приводит к ошибке.
В любом случае, я расточительно использовал оба. Сначала я конвертирую в дату в условии, только чтобы выбросить результат. Затем я воссоздаю результат с другим синтаксисом. Я изменяю это на
$date = $date -as [DateTime];
if (!$date)
{
'You entered an invalid date'
exit 1
}
Спасибо всем.