1

我正在检索 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但我根本无法解析它,而且我真的不关心毫秒。

4

2 回答 2

8

制作格式字符串yyyyMMddHHmmsshh为 12 小时制,HH为 24 小时制。见这里

于 2013-07-19T18:59:47.093 回答
0

您很可能已经想到了这一点,但我注意到您在 foreach 循环中的“if”语句末尾有“$ .CreationDate = $date”;由于 $ .CreationDate 已经声明,您可能可以消除/注释掉该部分以避免可能的“类型不匹配”错误。

于 2013-11-24T18:59:59.807 回答