2017-09-08 7 views
1

In PowerShell versuche ich eine Zeichenfolge, die ich aus einer Textdatei auswählte, in ein Datum zu konvertieren, so dass ich Tage, Stunden und so weiter hinzufügen oder subtrahieren kann. Das Problem ist, dass, wenn ich versuche, das führte Zeichenfolge aus der Textdatei zu konvertieren, ich die folgende Fehlermeldung an:String to Date Fehler

Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime." 

At line:15 char:5 

+  [datetime]::ParseExact($SC4,'HH:mm:ss', $null) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : FormatException 

Der Code:

Get-Content results2.txt | ForEach-Object{ 
$splitUp = $_ -split " " 
$SC=$splitUp[0] -split " " 
$SC2=$splitUp[1] -split " " 
$SC3=$SC + $SC2 
Write-Host -NoNewline $SC3 | Write-Output $SC4 
Write-Host $SC4 
$r=[datetime]::ParseExact($SC4,'dd/MM/yyyy HH:mm:ss', $null) 
echo $r 

}

Die Datei result2.txt , von dem ich gelesen, enthält folgende Komponenten:

09/07/2017 16:35:56 - 2017-09-07 14:55:51,312 [342] 
09/07/2017 16:35:56 - 2017-09-07 14:55:51,312 [342] 
09/07/2017 16:35:56 - 2017-09-07 14:56:54,918 [305] 
09/07/2017 16:35:56 - 2017-09-07 14:58:36,133 [113] 

Antwort

1

das Problem ist, weil $SC4 ist eine leere Variable. Ihr Versuch, es über eine Pipe der Ausgabe von Write-Host zu füllen funktioniert nicht (weil Write-Host schreibt an die Konsole und nicht an die Pipeline).

Der ganze Teil über kompliziert Dinge und kann einfach entfernt werden. Dies funktioniert in meinem Test fein:

Get-Content result2.txt | ForEach-Object { 
    $splitUp = $_ -split " " 
    $SC=$splitUp[0] -split " " 
    $SC2=$splitUp[1] -split " " 
    $SC3 = $SC + $SC2 
    $r=[datetime]::ParseExact($SC3,'dd/MM/yyyy HH:mm:ss', $null) 
    echo $r 
} 

Hier ist eine kürzere Lösung, die regex verwendet in der Datei das erste Datum übereinstimmen:

Get-Content result2.txt | ForEach-Object { 
    $Check = $_ -Match '^\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}(?= .*$)' 
    If ($Check) { $R=[datetime]::ParseExact($Matches[0],'dd/MM/yyyy HH:mm:ss', $null) } 
    Echo $R 
} 
+0

Dank! Jetzt funktioniert es. Ich tat das, weil, wenn ich $ SC3 zeige, es das Datum auf einer Reihe und Zeit auf dem nächsten anzeigt, also dachte ich, dass es das von ParseExact benötigte Format stören wird. Danke noch einmal! –

0

Andere Methode:

Get-Content "c:\temp\test.txt" | ForEach-Object { 
    [datetime]::ParseExact(($_ -split " - ")[0],'dd/MM/yyyy HH:mm:ss', $null) 
} 


#short version 
gc "c:\temp\test.txt" |%{[datetime]::ParseExact(($_ -split " - ")[0],'dd/MM/yyyy HH:mm:ss', $null)}