Powershell if Schleife mit 2 Variablen nicht möglich?

-Overlord-

Lt. Commander
Registriert
Okt. 2007
Beiträge
1.076
Hey Leute

Ich probiere hier gerade an einem Script rum, welches zwei Daten vergleichen soll, allerdings funktioniert das nicht. Wenn ich statt $date2 das Datum händisch eintrage '14.05.2021 12:30:02' funktioniert es. Was mache ich falsch? o_O

if ( $date1 -like $date2 )
{
Write-Host 'Datum ist identisch'
}
else
{
Write-Host 'Datum ist nicht identisch'
}

Mittels Write-Host auf date1 und date2, untereinander, sehe ich, dass beide Daten korrekt sind. Er liest auch die erste Variable aus, aber irgendwie klappt das nicht mit zwei Variablen. Danke schon mal für eure Hilfe

Greetz
 
Wie sehen deine beiden Variablen denn aus?
Ein einfaches Get-Date übertragt das aktuelle Datum samt Uhrzeit
 
$shouldbe="12:30:02"
$Date = Get-Date -Format d
$shouldbedate="$Date $shouldbe"
$LastWriteTime=Get-Item C:\Temp\Projekt\testfile.txt | Foreach {$_.LastWriteTime}

if ( $shouldbedate -like $LastWriteTime )
{
Write-Host 'Datum ist identisch'
}
else
{
Write-Host 'Datum ist nicht identisch'
}

Was mich allerdings verwundert:
Get-Item C:\Temp\Projekt\testfile.txt | Foreach {$_.LastWriteTime}
gibt
Freitag, 14. Mai 2021 12:30:02
aus. Und wenn ich
$LastWriteTime=Get-Item C:\Temp\Projekt\testfile.txt | Foreach {$_.LastWriteTime}
Kommt mittels
Write-Host $LastWriteTime
folgendes raus:
14.05.2021 12:30:02
 
Ich muss mal mein altes Script raussuchen. Deine Zeitpunktsabfrage passt nicht ($shouldbedate).
Das kannst du streichen indem du dein $date genauer bezifferst, wie z.b:

$date = Get-Date -Format D -Hour 12 -Minute 30 -Second 02 -Millisecond 0
 
Das wäre natürlich eine Möglichkeit - klappt aber nicht. Bist du dir sicher, dass man date dynamisch auslesen kann und dann aber eine Feste Uhrzeit mitgeben kann?
 
  • Gefällt mir
Reaktionen: cloudman
Innensechskant schrieb:
Probier mal statt -like mit -eq?

Auch schon gemacht - wenn ich z.B.
$date1=123
$date2=123

Mache klappt das. Aber mit den Daten von mir irgendwie nicht, obwohl die Ausgabe in der Überprüfung identisch aussieht:

14.05.2021 12:30:02
14.05.2021 12:30:02
Datum ist nicht identisch
 
Dein Problem ist, dass du einen Zeitstempel und einen String vergleichst.

Ich habe noch nicht ganz verstanden was du dort baust :)
es sollte aber mit folgender Prüfung in der IF Schleife klappen: if ($shouldbedate -eq $LastWriteTime.ToString())

schön ist anders :)

edit: Den Typ eines Wertes in der Variablen kannst du mit $test.GetType() erfahren.
Beim Vergleich von Zeitstempeln wird es dann aber schwer, weil dir ggf. die Millisekunden und Ticks aus dem Zeitstempel fehlen.
 
Zuletzt bearbeitet:
Aso geht natürlich auch anders - ich wollte eigentlich nur prüfen ob eine Datei zu einem festgelegten Zeitpunkt erstellt wurde. Dieser Zeitpunkte sollte immer derselbe sein.
 
Und ich glaube genau das ist das schwere beim Zeitstempel als DateTime da spielen ja auch einzelne Ticks und MS eine Rolle (technisch basiert der Zeitstempel auf Ticks)

Folgende Eigenschaften hat dein Last Write Time im Detail:
PowerShell:
$test.lastWriteTime | fl

Date        : 19.04.2021 00:00:00
Day         : 19
DayOfWeek   : Monday
DayOfYear   : 109
Hour        : 21
Kind        : Local
Millisecond : 864
Minute      : 3
Month       : 4
Second      : 2
Ticks       : 637544629828645773
TimeOfDay   : 21:03:02.8645773
Year        : 2021
DateTime    : Montag, 19. April 2021 21:03:02

In deinem Falls solltest du also wie folgt vergleichen:
Code:
$shouldbedate= Get-Date("14.05.2021 12:30:02")
$LastWriteTime=Get-Item C:\Temp\Projekt\testfile.txt

if ($shouldbedate.toString() -eq $LastWriteTime.toString())
{
..
}
Ergänzung ()

Wenn du nur prüfen willst ob die datei aktuell beschrieben wird, dann solltest du sowas nehmen wie:
if ($lastWriteTime -gt (Get-Date.Addminutes(-5))

Damit prüft er ob die Datei die letzten 5 Minuten beschrieben wurde.
Ergänzung ()

letzter Edit:
Wenn du prüfen willst wann eine Datei erstellt wurde ist übrigens das Dateiattribut CreationTime das richtige. Nicht LastWriteTime
 
Zuletzt bearbeitet:
Aus purer Langeweile habe ich ein bisschen rumgespielt :D und bin zu folgendem Ergebnis, welches bei mir funktioniert, gekommen:

PowerShell:
$File1 = (Get-ChildItem "D:\Labor\APP\USB\UsbTest.txt").CreationTime
$File2 = (Get-ChildItem "D:\Labor\APP\USB\PScab.txt").CreationTime

$CultInfo = New-Object System.Globalization.CultureInfo("de-DE")
$CurDateTimeFile1 = $File1.ToString("dd.MM.yyyy HH:mm:ss",$CultInfo)
$CurDateTimeFile2 = $File2.ToString("dd.MM.yyyy HH:mm:ss",$CultInfo)

If ($CurDateTimeFile1 -Eq $CurDateTimeFile2)
{
Write-Host "Datum ist identisch"
}
Else
{
Write-Warning "Datum ist nicht identisch"
}
 
-Overlord- schrieb:
Wenn ich statt $date2 das Datum händisch eintrage '14.05.2021 12:30:02' funktioniert es. Was mache ich falsch? o_O
Du versuchst ein Datum als String auszuwerten.

Besser:
PowerShell:
$date1 = Get-Date
$date2 = Get-Date
$deltaT = $date1.Subtract($date2)
$deltaT hält jetzt die exakte Differenz zwischen beiden Datumswerten und Du kannst auf Identität prüfen ($deltaT.Ticks -eq 0) oder eine Kulanz definieren ($deltaT.TotalSeconds -lt X).

Darauf achten, daß sich das Vorzeichen der Eigenschaften in $deltaT an der Reihenfolge orientiert. "Älter" minus "neuer" = positiv. "Neu" minus "alt" = negativ. Also Math::abs() verwenden oder erst auf Ordnung prüfen.


Strings haben hier überhaupt nichts zu suchen. Das geht nur schief.
 
RalphS schrieb:
Strings haben hier überhaupt nichts zu suchen. Das geht nur schief.
Wenn man nur wissen möchte, ob es unterschiedliche Zeitangaben bei bestimmten Dateien bezüglich der Erstellung gibt und sich die Angaben ausgeben lassen möchte, dann ist der Weg über die Strings keineswegs abwegig.
Wenn man es dann so macht, wie oben von mir dargestellt, dann entsprechen die Zeitangaben exakt denen in den Dateieigenschaften. Da geht gar nix schief, wie man am nachfolgenden Bild sehr schön erkennen kann.

Wenn man sich natürlich die Unterschiede in Anzahl der Tage, Wochen, Monate, Jahre, Stunden, Minuten und Sekunden berechnen und ausgeben lassen möchte, dann wählt man den Weg über die von dir aufgeführte Methode.
Ich frage mich nur gerade, welchen Grund es dafür geben könnte, dass man die Unterschiede bis ins Detail wissen möchte.

Screenshot.png
 
NotNerdNotDau schrieb:
Aus purer Langeweile habe ich ein bisschen rumgespielt :D und bin zu folgendem Ergebnis, welches bei mir funktioniert, gekommen:

PowerShell:
$File1 = (Get-ChildItem "D:\Labor\APP\USB\UsbTest.txt").CreationTime
$File2 = (Get-ChildItem "D:\Labor\APP\USB\PScab.txt").CreationTime

$CultInfo = New-Object System.Globalization.CultureInfo("de-DE")
$CurDateTimeFile1 = $File1.ToString("dd.MM.yyyy HH:mm:ss",$CultInfo)
$CurDateTimeFile2 = $File2.ToString("dd.MM.yyyy HH:mm:ss",$CultInfo)

If ($CurDateTimeFile1 -Eq $CurDateTimeFile2)
{
Write-Host "Datum ist identisch"
}
Else
{
Write-Warning "Datum ist nicht identisch"
}
Es geht ja nicht darum zwei Dateien unmittelbar miteinander zu vergleichen.

Ich habe mehrere Systeme wo eine Datei erstellt wird. Diese Datei wird dann eingelesen - wichtig ist allerdings, dass die LastWriteTime identisch ist von allen Dateien. Das will ich mittels eines kurzen Scriptes abfragen.
 
-Overlord- schrieb:
Es geht ja nicht darum zwei Dateien unmittelbar miteinander zu vergleichen.
In deinem Eingangspost liest sich das aber genau so:
-Overlord- schrieb:
Ich probiere hier gerade an einem Script rum, welches zwei Daten vergleichen soll

Mehrere Systeme?
Wo befinden die sich? Jeweils auf mehreren Rechnern?
Besteht ein Heimnetzwerk, oder ein NAS?

Oder sind alle Systeme in einem Rechner, auf unterschiedlichen Datenträgern?

Wohin werden/wird diese erstellte(n) Datei(en) eingelesen?

Deine Angaben sind ein bisschen vage. Wenn du Hilfe benötigst, dann solltest du konkreter werden.
Ansonsten kann man nur raten, oder die Glaskugel aus der Schatulle hervorholen.
 
Dann hab ich mich ein wenig missverständlich ausgedrückt.

Ich möchte eigentlich nur, dass jeden Tag geprüft wird, ob Datei xy an dem Tag zur ein und derselben Uhrzeit erstellt wurde. Also Tag variiert, aber Uhrzeit sollte immer identisch sein. Vielleicht hab ich in dem Script ein wenig verworrener gedacht, als es eigentlich ist.
 
Was ist für Dich ein und dieselbe Uhrzeit? Zeit sagst Du. Reicht Stunde? Minute? Sekunde? Millisekunden? Ticks? Das ist doch das Problem hier...

Wenn die Datei auf 2 verschiedenen Systemen erstellt wird, wirst Du spätestens ab Millisekunde nicht mehr den gleichen Wert haben, selbst für Sekunden würd ich nicht meine Hand ins Feuer legen...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: NotNerdNotDau
Gut, lassen wir mal ausser acht, dass ich irgendeine Idee hab. Ob die gut oder schlecht ist, ist ja mein Problem ;) Und nun frage ich diese Community hier, ob sie mir helfen möchte, diese Idee zu realisieren - es geht nicht um das warum, sondern um das wie :D Eigentlich dachte ich, ist das Thema schnell vom Tisch, da es "nur eine Kleinigkeit" ist.

Aber für die die, die es interessiert: Jedes System hat einen Task, der eine Datei generiert. Damit alle Dateien dieselbe Uhrzeit haben, will ich ein kurzes Script schreiben, welches eine Ausgabe gibt und die wird dann mittels Nagios abgefragt. Dann sehe ich unter Nagios den Host xy mit allen Ausgaben von den Systemen und kann auf einen Blick sehen, ob alle Dateien zur selben Zeit erstellt wurden. Und was meine ich mit Zeit - das was oben bereits steht: 14.05.2021 12:30:02. Das Problem ist hier auch nicht das erstellen - die Dateien werden alle wunderbar zur selben Zeit erstellt - ich möchte lediglich abfragen, ob das auch passt.
 
Zuletzt bearbeitet:
-Overlord- schrieb:
Gut, lassen wir mal ausser acht, dass ich irgendeine Idee hab. Ob die gut oder schlecht ist, ist ja mein Problem ;) Und nun frage ich diese Community hier, ob sie mir helfen möchte, diese Idee zu realisieren - es geht nicht um das warum, sondern um das wie :D Eigentlich dachte ich, ist das Thema schnell vom Tisch, da es "nur eine Kleinigkeit" ist.

Aber für die die, die es interessiert: Jedes System hat einen Task, der eine Datei generiert. Damit alle Dateien dieselbe Uhrzeit haben, will ich ein kurzes Script schreiben, welches eine Ausgabe gibt und die wird dann mittels Nagios abgefragt. Dann sehe ich unter Nagios den Host xy mit allen Ausgaben von den Systemen und kann auf einen Blick sehen, ob alle Dateien zur selben Zeit erstellt wurden. Und was meine ich mit Zeit - das was oben bereits steht: 14.05.2021 12:30:02. Das Problem ist hier auch nicht das erstellen - die Dateien werden alle wunderbar zur selben Zeit erstellt - ich möchte lediglich abfragen, ob das auch passt.

Aber es ist auch ganz klassisch, dass hier im Forum, und in anderen natürlich auch, eine Frage für eine Problemstellung gestellt wird, und sich schon gewisse Vorgedanken gemacht wurde. Und diese Vorgedanken oder die grundsätzliche Problemstellung werden meist verschwiegen.
Dabei könnte man doch auf das große KnowHow der vielen User hier zurückgreifen und eine Lösung für das grundsätzliche Problem bekommen.

Ich habe da direkt eine Idee für dein Nagios Monitoring: Ist es denn so elementar wichtig, dass die Dateien zur expliziten Uhrzeit erstellt wurden? Würde es nicht ausreichen das Erstellungsalter der Dateien(en) abzufragen, und wenn dieses Datum > 24 Std. ist, weiss man dass die Erstellung nicht geklappt hat und man könnte eine gewisse Meldung generieren.
 
Ja leider - das abfragen der generellen Änderungszeit ist auch kein Problem. Auf den Blick sehe ich ja, dass die Dateien auf den Systemen z.B. vor 320 Minuten erstellt wurden und alle synchron sind. Sollte aber eine nun vor 330 Minuten erstellt sein, gibt er kein Warn oder Crit aus. Wollte das umgehen mit einem zusätzlichen Check der in dem Fall anspringt.
 
Zurück
Oben