apophis
Goto Top

Powershell: amerikanischen Zeitstempel in deutschen umwandeln

Hallo,

ich kann zwar Batch, aber kein Powershell. Nun habe ich das Problem, das ein Powershell-Script aus einer XML-Logdatei einen Datumsstempel ausliest und zu diesem Stempel eine Anzahl Sekunden hinzuaddieren soll.

$finjob = ($job.actualstarttime -as [datetime]).addseconds($job.elapsedtimeseconds)	#Adding total time to start time so we know when it ended

$finjob ist immer leer. Ich vermute, daß liegt daran, das Datumsstempel in $job.actualstarttime im amerikanischen Format, also z.B. "6/17/2017 4:30:05 PM", vorliegt und das der Befehl aber das deutsche Format sehen möchte.

Wäre der Zeitstempel ohne Uhrzeit, würde folgender Code (dank Tante Google) funktionieren:

$cultureUS = New-Object System.Globalization.CultureInfo("en-US")   
$strtime = $job.actualstarttime
$strtime=[datetime]::ParseExact($strtime,"M/dd/yyyy",$cultureUS)  
$finjob = ($strtime -as [datetime]).addseconds($job.elapsedtimeseconds)	

Wie muss nun die Uhrzeit da hinzu geflickt werden?

Danke

Gruß
Apophis

Content-ID: 341086

Url: https://administrator.de/contentid/341086

Ausgedruckt am: 24.11.2024 um 15:11 Uhr

AndreasHoster
AndreasHoster 20.06.2017 aktualisiert um 12:06:47 Uhr
Goto Top
Vermutungen sind schön, meistens aber nicht zielführend.
Ich würde ja erstmal einzeln schauen, was da wirklich rauskommt.

Also:
Was ist das Ergebnis von
$job.actualstarttime 
Was ist das Ergebnis von
($job.actualstarttime -as [datetime])
Was ist das Ergebnis von
$job.elapsedtimeseconds

Danach kann man sich fundiert Gedanken darüber machen wo es schiefgeht.
Apophis
Apophis 20.06.2017 um 13:00:10 Uhr
Goto Top
Hallo,

Zitat von @AndreasHoster:

Vermutungen sind schön, meistens aber nicht zielführend.
Ich würde ja erstmal einzeln schauen, was da wirklich rauskommt.

Es gibt aber schon starke Vermutungen nahe der Gewissheit, zumal es nur mit den Datum ja geht - was beweist, daß dem Script da irgendwas quer liegt.

Also

> $job.actualstarttime 
> 

Ergebnis: 6/17/2017 4:30:05 PM

> ($job.actualstarttime -as [datetime])
> 

Nichts. Es wird nichts ausgegeben.

Was ist das Ergebnis von
> $job.elapsedtimeseconds
> 

Eine Zahl, z.B. 844

Wegen der Sicherheit habe ich im Code das -as [datetime] weggelassen, aber das Ergebnis ist das Gleiche. Soweit ist die Sache klar: wenn die Konvertierung in das Datumsfomat nichts zurückliefert, kann auch nichts dazu gerechnet werden. Nur der Vollständigkeit halber: das Script beschwert sich auch mit der passenden Fehlermeldung:

You cannot call a method on a null-valued expression.

Gruß
Apophis
emeriks
Lösung emeriks 20.06.2017 um 13:25:51 Uhr
Goto Top
Hi,
wenn ich bei mir
[datetime]"6/17/2017 4:30:05 PM"  
eingebe, dann kommt
Samstag, 17. Juni 2017 16:30:05
raus.

E.
Apophis
Apophis 20.06.2017 um 13:39:32 Uhr
Goto Top
Yay, jetzt geht's.

    $strtime=[datetime]($job.actualstarttime)    
    $finjob = ($strtime).addseconds($job.elapsedtimeseconds)	

Dein Tipp war Gold wert, Danke.

Gruß
Apophis
AndreasHoster
Lösung AndreasHoster 20.06.2017 um 13:44:47 Uhr
Goto Top
Die Datumsformate sind echt ein ...

Nach ein bischen experimentieren sollte folgendes gehen (wenn das Format gleich bleibt):
$en = New-Object system.globalization.cultureinfo(“en-US”)
$finjob = ([datetime]::parseexact($job.actualstarttime,"M/d/yyyy h:mm:ss tt",$en)).addseconds($job.elapsedtimeseconds)  
[datetime] alleine nimmt irgendeine Datumsformatdefinition, mit der .Net Funktion parseexact kann man den Formatstring mitangeben, dann klappt auch die Konvertierung.
Apophis
Apophis 20.06.2017 um 14:24:32 Uhr
Goto Top
Hallo,

yep, das funktioniert ebenso.

Danke.

Gruß
Apophis