我正在检索WMI win32_process信息并尝试将CreationDate转换为更具可读性的内容
$Header = @("__SERVER","Caption","CommandLine","CreationDate","ProcessID")
$processes = Get-WmiObject win32_process -ComputerName theComputer |? {$_.caption -eq "java.exe"} | select $header
#Format-Date
$processes | % {
$crdate = $_.CreationDate
if($crdate -match ".\d*-\d*") {
$crdate = $crdate -replace $matches[0]," "
$idate = [System.Int64]$crdate
$date = [DateTime]::ParseExact($idate,'yyyyMMddhhmmss',$null)
$_.CreationDate = $date
}
}
此功能运行良好,但有时会失败并显示错误消息:
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
我知道我正在传入一个int,我也尝试将$idate
转换为一个String并将其传入,但它在相同的值上出错了。
示例输入:(在ParseExact调用之前$ idate的值)
20130719113954
20130719114700
20130719133000< ----这失败了
20130719053000
20130719060001
20130719134000< ----失败
很明显,此功能仅在12:00之前有效
我的问题是如何识别军事时间?在12岁之前,它会向我吐出一个看起来像7/19/2013 11:47:00 AM
的好日子。如果它不接受军事时间,将如何解析AM和PM之间的区别?
注意:win32_process最初返回一个CreationDate值,如20130719133000.137239-240
但是我根本无法解析它,我真的不在乎毫秒。
答案 0 :(得分:8)
制作格式字符串yyyyMMddHHmmss
。 hh
为12小时格式,HH
为24小时格式。请参阅here。
答案 1 :(得分:0)
你很可能已经想到了这一点,但我注意到你的foreach循环中'if'语句末尾有'$ .CreationDate = $ date';由于$ .CreationDate已经声明,你可以消除/注释掉那部分以避免可能的“类型不匹配”错误。