Многие командлеты PowerShell принимают на вход дату, причём дата может быть передана в виде текста или может быть объектом DateTime. Я предпочитаю работать с объектами, поэтому приведу несколько вариантов создания объекта DateTime
для использования в скриптах PowerShell.
Для примера рассмотрю запланированное время начала телевизионной трансляции новогоднего поздравления президента РФ с наступающим 2018 годом: 31 декабря 2017 г. 23:55:00.
Использование командлета Get-Date
Передача аргументов выполняется через параметры:
Get-Date -Year 2017 -Month 12 -Day 31 -Hour 23 -Minute 55 -Second 0
Передача аргументов с использованием сплаттинга:
$param = @{'Year' = 2017; 'Month' = 12; 'Day' = 31; 'Hour' = 23; 'Minute' = 55; 'Second' = 0}
Get-Date @param
При использовании этого способа следует иметь в виду, что если какой-то из параметров не задан, для него будет использовано текущее значение времени.
Стандартное создание объекта
В этом случае важно следить за порядком и количеством аргументов, иначе попытка создать объект DateTime
завершится ошибкой.
# Вариант 1
New-Object DateTime (2017, 12, 31, 23, 55, 00)
# Вариант 2
[DateTime]::new(2017, 12, 31, 23, 55, 00)
Преобразование типа из String в DateTime
Выполняется очень просто:
[DateTime]'2017.12.31 23:55:00'
Это самый опасный в использовании способ создания объекта DateTime
, так как легко может быть допущена ошибка в формате строки, определяющей время, что приведёт к получению некорректного результата. Особенно строго следует следить за использованием этого способа при автоматической обработке логов программ, в которых строковое представление даты может быть записано в неподходящем формате.
Например, попытка преобразования строки, на первый взгляд, описывающую корректную дату, '31.12.2017 23:55:00'
, приведёт к ошибке. В этом случае следует использовать метод DateTime::Parse, который произведёт корректный разбор даты в переданной строке.
[DateTime]::Parse('31.12.2017 23:55:00')
Если метод DateTime::Parse
не подходит, потому что строковое представление даты задано в нестандартном виде, следует воспользоваться методом DateTime::ParseExact, позволяющем задать маску, по которой будет производиться разбор даты. Так, чтобы дата из предыдущего примера была успешно преобразована в объект DateTime
, можно использовать следующий код:
[DateTime]::ParseExact('31.12.2017 23:55:00', 'dd.MM.yyyy HH:mm:ss', $null)
Теперь создание объектов DateTime
для удобной работы с датами в скриптах PowerShell не должно вызывать затруднений.