В продолжение предыдущей темы о конвертации значений даты и времени, в этот раз поговорим об объектах WMI.
Для получения экземпляров объектов WMI нам доступны несколько способов. Один из них — это использование командлетов модуля CIMCmdlets. Например, так:
$cim = Get-CimInstance -ClassName Win32_OperatingSystem
Теперь, если мы посмотрим на значение свойства LastBootUpTime, мы увидим, что оно вполне себе похоже на объект DateTime.
$cim.LastBootUpTime Friday, September 8, 2017 1:02:20 PM
Чтобы окончательно отбросить все сомнения, мы можем узнать тип данных этого значения при помощи метода GetType или командлета Get-Member.
$cim.LastBootUpTime.GetType().FullName System.DateTime $cim.LastBootUpTime | Get-Member | Select-Object -Property TypeName -Unique TypeName -------- System.DateTime
Однако же, если вместо командлетов CIM мы по каким-то причинам решим воспользоваться командлетами WMI (Windows XP?), то значение этого свойства будет выглядеть несколько по-другому.
$wmi = Get-WmiObject -Class Win32_OperatingSystem $wmi.LastBootUpTime 20170908130220.494386+180
Кроме того, воспользовавшись любым из вышеприведенных способов определения типа данных этого значения, мы увидим, что это объект System.String.
$wmi.LastBootUpTime.GetType().FullName System.String $wmi.LastBootUpTime | Get-Member | Select-Object -Property TypeName -Unique TypeName -------- System.String
Для того, чтобы конвертировать его в объект DateTime, раньше нам пришлось бы действовать самостоятельно. Например, так:
$initialValue = $wmi.LastBootUpTime.Substring($wmi.LastBootUpTime.IndexOfAny('+,-')) $resultValue = $initialValue.Substring(0,1) + ($initialValue.Substring(1) / 60) $string = $wmi.LastBootUpTime.Replace($initialValue, $resultValue) $formatString = 'yyyyMMddHHmmss.ffffffz' [datetime]::ParseExact($string, $formatString, [System.Globalization.CultureInfo]'ru-ru') Friday, September 8, 2017 1:02:20 PM
Однако, с некоторого времени объекты WMI в PowerShell содержат два дополнительных метода: ConvertToDateTime и ConvertFromDateTime, реализуемых при помощи статических методов класса System.Management.ManagementDateTimeConverter.
Первый из них, ConvertToDateTime, предназначен для конвертации возвращаемых командлетом Get-WMIObject значений даты и времени в объекты типа System.DateTime.
$wmi.ConvertToDateTime($wmi.LastBootUpTime) Friday, September 8, 2017 1:02:20 PM
Того же самого результата мы можем добиться, обратившись к классу System.Management.ManagementDateTimeConverter напрямую:
[System.Management.ManagementDateTimeConverter]::ToDateTime($wmi.LastBootUpTime) Friday, September 8, 2017 1:02:20 PM
Что касается второго метода, ConvertFromDateTime, результат его выполнения прямо противоположен:
$date = Get-Date $date Friday, September 8, 2017 1:46:41 PM $wmi.ConvertFromDateTime($date) 20170908134641.224432+180
Или же так:
[System.Management.ManagementDateTimeConverter]::ToDmtfDateTime($date) 20170908134641.224432+180
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell