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、文字列に変換してそれを渡そうとしましたが、同じ値でエラーが発生しました。

サンプル入力:(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 に答える