2017-07-04 7 views
0

Ich versuche, eine Datei für nur die neuesten Einträge zu analysieren. Jeder Eintrag in der Protokolldatei beginnt mit dem Datum im Format "m/d/jjjj h: mm: ss PM".Zeichenfolge in Datetime in Powershell 2.0 konvertieren

Ich schreibe ein Skript, das erreicht, was ich wollte, aber leider dieses Skript läuft auf Powershell 5, aber nicht Powershell 2

$regex = '\b([1-2][0-9]|[0-9])\/([1-3][0-9]|[0-9])\/(20[0-9][0-9]) ((1[0-2]|0?[1-9]):([0-5][0-9]):([0-5][0-9]) ([AaPp][Mm]))' 

$lines = gci C:\temp\Gateway.log | select-string -pattern $regex |select linenumber, matches 
[email protected]() 
foreach($line in $lines) 
{ 
    [datetime]$logdate = ($line.matches).value 
    $ln = $line.linenumber 

    if ($logdate -gt '2017-06-29 12:00:00') 
    { 
     $log += $ln 
    } 
} 

$log 

Wenn ich versuche, dieses Skript auf dem Server mit Powershell 2 zu laufen, bekomme ich die folgenden Error.

NULL kann nicht in den Typ "System.DateTime" konvertiert werden.

Ich habe Probleme, den Wert, der von der Auswahlzeichenfolge in Datetime gefunden wird, zu konvertieren. versuchte

$dt = $line.matches 
    $val = $dt|select Value 
    $val1 = $val|Out-String 
    $val2 = $val.tostring() 
    [datetime]$val1 
    [datetime]$val2 

Wie kann ich den Wert als Datetime-String mit tostring und auch mit Out-String zu konvertieren bekommen so in es ich kann Powershell 2 datemath tun auf?

+0

Unabhängig von Powershell-Version unterstützt, einfach die Zeichenfolge Gießen auf 'DateTime' ist schlechter Stil, weil es das Gebietsschema übernimmt übernimmt tatsächlich Datums-/Zeitwerte von dieses spezifische Format. Verwenden Sie stattdessen etwas wie '[DateTime] :: ParseExact ($ val1," M/d/jjjj H: mm: ss tt ", [CultureInfo] :: InvariantCulture)'. (Ich vergesse, dass es eine PowerShell-Methode gibt.) –

+0

Beachten Sie auch, dass Ihre Regex übermäßig kompliziert ist: Sie müssen sich wirklich nicht darum kümmern, wenn jemand versucht, "14/68/3016 1:62:63 PM" zu übergeben 'als ein gültiges Datum/Zeit, lassen Sie einfach den Parser sortieren, das ungültig ist. Dinge wie '[0-9] +' sind gut für einfache Abgrenzungsarbeiten. Wenn das Datum/die Uhrzeit eine feste Größe oder ein Nicht-Leerzeichen-Trennzeichen aufweist, ist es noch einfacher. –

+0

@JeroenMostert der Großbuchstabe 'H' bezeichnet ein 24-Stunden-Format, Kleinbuchstaben' h' ändern – LotPings

Antwort

1

Nach meiner Erfahrung funktioniert die am/pm-Konvertierung nicht (auch nicht mit [CultureInfo] :: InvariantCulture), wenn Ihre aktuellen Gebietsschemaeinstellungen nicht damit übereinstimmen.

Sie benötigen ein Cultureinfo-Objekt angeben, die am/pm

$enUS = 'en-US' -as [Globalization.CultureInfo] 
$val1 = (get-date).ToString("M/d/yyyy H:mm:ss tt", $enUS) 
$val1 
[DateTime]::ParseExact($val1, "M/d/yyyy H:mm:ss tt", $enUS) 
+0

Ich muss mein Übereinstimmungsdatum als ein Array umwandeln, da tostring() nichts konvertiert. $ enUS = 'en-US' -als [Globalization.CultureInfo] $ dt = $ line.matches $ val = @ ($ dt |% {$ _. Wert}) $ val = $ val [0]. ToString() [DateTime] :: ParseExact ($ val, "M/d/jjjj H: mm: ss tt", $ enUS) –

+0

Vorsicht mit dem Großbuchstabe 'H', nach [diesen Tabellen] (https : //ss64.com/ps/syntax-dateformats.html) Sie benötigen den Kleinbuchstaben "h" für 12 Stunden am/pm Format. – LotPings

Verwandte Themen