2 CSV Dateien per Powershell vergleichen und automatisieren
Hallo,
ich benötige ein Script, wo ich zwei CSV-Dateien vergleichen möchte. Es soll mir die Unterschiede ausspucken, welche neu dazugekommen ist oder welche zu dem vorherigen CSV gelöscht wurde, also z. B Server ID, etc. . Außerdem soll das automatisiert sein, also es soll alle 4 Wochen überprüft werden z. B die CSV-Datei vor 4 Wochen und die CSV-Datei von heute. Das Ergebnis mit den unterschiedlichen Werten im CSV soll entweder mit "xlsx" oder "csv" separat in einem Ordner exportiert werden, also z. B mit einem Export Befehl.
Was noch zu beachten ist, dass die Dateiname sich auch ändert, also z. B. die CSV-Datei Server_2022.06.13 von heute und die CSV-Datei vor 4 Wochen also Server_2022.05.13. Das muss auch im Script bei der Automatisierung berücksichtigt werden.
Ich hoffe, dass Ihr mir helfen könnt.
ich benötige ein Script, wo ich zwei CSV-Dateien vergleichen möchte. Es soll mir die Unterschiede ausspucken, welche neu dazugekommen ist oder welche zu dem vorherigen CSV gelöscht wurde, also z. B Server ID, etc. . Außerdem soll das automatisiert sein, also es soll alle 4 Wochen überprüft werden z. B die CSV-Datei vor 4 Wochen und die CSV-Datei von heute. Das Ergebnis mit den unterschiedlichen Werten im CSV soll entweder mit "xlsx" oder "csv" separat in einem Ordner exportiert werden, also z. B mit einem Export Befehl.
Was noch zu beachten ist, dass die Dateiname sich auch ändert, also z. B. die CSV-Datei Server_2022.06.13 von heute und die CSV-Datei vor 4 Wochen also Server_2022.05.13. Das muss auch im Script bei der Automatisierung berücksichtigt werden.
Ich hoffe, dass Ihr mir helfen könnt.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3065449376
Url: https://administrator.de/contentid/3065449376
Ausgedruckt am: 26.11.2024 um 11:11 Uhr
77 Kommentare
Neuester Kommentar
Moin,
Gruß Thomas
# Quellordner mit CSV-Dateien
$Source = "C:\Pfad\zu\CSV-Dateien\"
#Zieldatei
$Target = "C:\Pfad\zur\AusgabeDatei.csv"
# CSV-Dateien auflisten, die nicht älter als 1 Monat sind
$CSV = Get-ChildItem "$Source\*.csv" | Where-Object LastWriteTime -gt (Get-Date).AddMonth(-1).Date | sort Name
# Neuste CSV mit ältester im Array vergleichen, Ergebnis in Zieldatei schreiben
Compare (Get-Content $CSV[-1]) (Get-Content $CSV) |
Select @{n="Aktuelle Datei";e={$CSV[-1].Name}},
SideIndicator,
@{n="Datei von letzem Monat";e={$CSV.Name}},
InputObject |
Export-CSV -Delimiter ';' -Encoding UTF8 $Target -NoTypeInformation
Gruß Thomas
Moin,
1. Wenn du hier solche Dinge postest, dann bitte mit Code-Tags. Das kann doch kein Schwein vernünftig lesen!
2. Wer legt denn zum Henker die Dateien unter "C:\Users\Public" ab!? Zudem: wer Darf denn dort hineinaschreiben?. Leg doch einfac auf C:\ einen Ordner "Scripting" oder so etwas an und operiere von dort aus.
3. Der Fehler wird eindeutig beschrieben. Die Funktion heust nicht AddMonth sondern AddMonths
4. Scripte nicht blind kopieren
Gruß
em-pie
1. Wenn du hier solche Dinge postest, dann bitte mit Code-Tags. Das kann doch kein Schwein vernünftig lesen!
2. Wer legt denn zum Henker die Dateien unter "C:\Users\Public" ab!? Zudem: wer Darf denn dort hineinaschreiben?. Leg doch einfac auf C:\ einen Ordner "Scripting" oder so etwas an und operiere von dort aus.
3. Der Fehler wird eindeutig beschrieben. Die Funktion heust nicht AddMonth sondern AddMonths
4. Scripte nicht blind kopieren
Gruß
em-pie
Damit der TO auch versteht wer oder was Code Tags sind!
Formatierungen in den Beiträgen
...und das sie mit dem "Bearbeiten" Knopf auch nachträglich noch funktionieren...
Formatierungen in den Beiträgen
...und das sie mit dem "Bearbeiten" Knopf auch nachträglich noch funktionieren...
Sorry ich bin neu hier. Ich hoffe, dass Ihr Verständnis dafür habt.
Ja, aber dennoch solltest du, wie dir mehrfach erklärt wurde, deinen o.a. Post editieren und dort Code Tags einfügen um den Scriptext statt es einfach zu ignorieren!! Lernen kann ja jeder...Es hilft ja auch später wenn andere das lesen...
es hat jetzt funktioniert, jedoch der Vergleich bzw. Unterschiede sind falsch.
Dan beschreibe doch mal, was inhaltlich falsch dabei heraus kam.Ich erkläre nochmal die Problemstellung:
Ich bekomme jeden Tag CSV Dateien. Ich möchte z.B. den heutigen CSV-Datei SERVER_PHYS__2022.06.13.csv mit der CSV-Datei, welche ich vor 4 Wochen erhalten habe vergleichen z. B. SERVER_PHYS__2022.05.13.csv.
Ich bekomme jeden Tag CSV Dateien. Ich möchte z.B. den heutigen CSV-Datei SERVER_PHYS__2022.06.13.csv mit der CSV-Datei, welche ich vor 4 Wochen erhalten habe vergleichen z. B. SERVER_PHYS__2022.05.13.csv.
Hinweis: 4 Wochen = 28 Tage
und 4 Wochen != 1 Monat
Das macht eine großen Unterschied.
Zu deinem Problem:
# Quellordner mit CSV-Dateien
$Source = "C:\Scripting\"
#Zieldatei
$Target = "C:\Scripting\AusgabeDatei.csv"
$file1 = "SERVER_PHYS__$((Get-Date).AddMonths(-1).ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
$Files = @($file1, $file2)
# CSV-Dateien auflisten, die nicht älter als 1 Monat sind
$CSV = Get-ChildItem "$Source\*.csv" -Include $Files |
sort Name
# Neuste CSV mit ältester im Array vergleichen, Ergebnis in Zieldatei schreiben
Compare (Get-Content $CSV[-1]) (Get-Content $CSV) |
Select @{n="Aktuelle Datei";e={$CSV[-1].Name}},
SideIndicator,
@{n="Datei von letzem Monat";e={$CSV.Name}},
InputObject |
Export-CSV -Delimiter ';' -Encoding UTF8 $Target -NoTypeInformation
Teste das mal bitte.
Moin,
Auch die Datei von heute kann ja noch nicht erstellt worden sein, je nachdem wann das Skript anläuft.
Daher würde ich es so belassen, wie ich oben geschrieben habe (natürlich mit fehlendem "s"):
So wird dann einfach immer die aktuellste und die älteste Datei innerhalb des Monats gewählt.
Gruß Thomas
Zitat von @em-pie:
das Problem hierbei: Die Datei von letztem Monat könnte ja auch auf ein Wochenende fallen und sofern kein 24/7 Betrieb herscht, nicht existieren.$file1 = "SERVER_PHYS__$((Get-Date).AddMonths(-1).ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
Auch die Datei von heute kann ja noch nicht erstellt worden sein, je nachdem wann das Skript anläuft.
Daher würde ich es so belassen, wie ich oben geschrieben habe (natürlich mit fehlendem "s"):
# CSV-Dateien auflisten, die nicht älter als 1 Monat sind
$CSV = Get-ChildItem "$Source\*.csv" | Where-Object LastWriteTime -gt (Get-Date).AddMonths(-1).Date | sort Name
Gruß Thomas
Zitat von @TK1987:
Moin,
Auch die Datei von heute kann ja noch nicht erstellt worden sein, je nachdem wann das Skript anläuft.
Stimmt wohl. Wobei er zu den Fällen ja nichts gesagt hat. Für den Fall müsste man in meiner Variante sicherlich noch ein paar Fehlerquellen abfangen.Moin,
Zitat von @em-pie:
das Problem hierbei: Die Datei von letztem Monat könnte ja auch auf ein Wochenende fallen und sofern kein 24/7 Betrieb herscht, nicht existieren.$file1 = "SERVER_PHYS__$((Get-Date).AddMonths(-1).ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
Auch die Datei von heute kann ja noch nicht erstellt worden sein, je nachdem wann das Skript anläuft.
Gruß Thomas
Grußem-pie
Moin,
Um das beantworten zu können, hast du uns bislang noch keinerlei Informationen über den Aufbau deiner CSV-Dateien gegeben (welche Trennzeichen? Überschriften vorhanden? ...). Bitte eine Exemplarische Datei im Codeblock posten.
Gruß Thomas
PS: Bitte keine Fullquotes -> sinnvoll zitieren.
Zitat von @Urfali:
Ich möchte nicht das alle Werte verglichen werden sollen. Wie kann ich einzelne Werte auswählen.
das ist ein volkommen neuer Umstand, der eigentlich direkt in den Eingangspost gehört.Ich möchte nicht das alle Werte verglichen werden sollen. Wie kann ich einzelne Werte auswählen.
Um das beantworten zu können, hast du uns bislang noch keinerlei Informationen über den Aufbau deiner CSV-Dateien gegeben (welche Trennzeichen? Überschriften vorhanden? ...). Bitte eine Exemplarische Datei im Codeblock posten.
Gruß Thomas
PS: Bitte keine Fullquotes -> sinnvoll zitieren.
Moin.
Nochmal: Bitte keine Fullquotes -> sinnvoll zitieren.
Wie werden die Daten ausgelesen? Wmic? Ggfs. lässt sich sich hier die Ursprungsdatei schon besser gestalten, denn das sind keine validen CSV's.
Mit den Augangsdateien, etwa so...
Gruß Thomas
Nochmal: Bitte keine Fullquotes -> sinnvoll zitieren.
Wie werden die Daten ausgelesen? Wmic? Ggfs. lässt sich sich hier die Ursprungsdatei schon besser gestalten, denn das sind keine validen CSV's.
Zitat von @Urfali:
Z. B. Ich möchte nach den einzelnen Werte suchen wie z. B. nach ID und Serial_No. Also selber auswählen können im Script, dass ich entscheiden kann welche Name dieser Werte es bei Änderung rausfiltern soll
Z. B. Ich möchte nach den einzelnen Werte suchen wie z. B. nach ID und Serial_No. Also selber auswählen können im Script, dass ich entscheiden kann welche Name dieser Werte es bei Änderung rausfiltern soll
Mit den Augangsdateien, etwa so...
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"
#Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"
# CSV-Dateien auflisten, die nicht älter als 1 Monat sind
$CSV = Get-ChildItem "$Source\*.csv" | Where-Object LastWriteTime -gt (Get-Date).AddMonths(-1).Date | sort Name
# Aktuelle CSV importtieren
$CSV_aktuell = Import-CSV -Delimiter "`t" $CSV[-1]
# Zu vergleichende Eigenschaften abfragen
$Properties = $CSV_aktuell.PSObject.Properties| select Name | Out-GridView -Title "Eigenschaten für Abgleich auswählen: " -PassThru
# Neuste CSV mit ältester im Array vergleichen, Ergebnis in Zieldatei schreiben
Compare $CSV_aktuell (Import-CSV $CSV -Delimiter "`t") -Property $Properties.Name |
Select @{n="Aktuelle Datei";e={$CSV[-1].Name}},
@{n="Datei von letzem Monat";e={$CSV.Name}},
* | Export-CSV -Delimiter ';' -Encoding UTF8 $Target -NoTypeInformation
Gruß Thomas
Moin,
dann lasse die das Ergebnis zunächst in ein Variable (=Objekt) schreiben und führe darauf einen Export mit deinen Spalten aus:
Teste das mal. das ist gerade ohne eine passable Umgebung und Testfiles aus dem Kopf entstanden.
dann lasse die das Ergebnis zunächst in ein Variable (=Objekt) schreiben und führe darauf einen Export mit deinen Spalten aus:
$result = Compare -ReferenceObject $csv1 -DifferenceObject $csv2 -Property ID, SERIAL_NO
$result | Select ID, SERIAL_NO | export-CSV -Delimiter ';' -Encoding UTF8 $Target -NoTypeInformation
Teste das mal. das ist gerade ohne eine passable Umgebung und Testfiles aus dem Kopf entstanden.
Moin,
dann streng mal deine Rübe an
was du bräuchtest:
dann streng mal deine Rübe an
was du bräuchtest:
- Get-ChildItem in eine Variable schreiben, limitiert auf deine beiden Dateien. Ein Beispiel hast du oben, wie du den ermitteln kannst.
- diese Variable ist dann ein Objekt und mit .Length kannst du die Dateigröße ermitteln.
- rechnen wirst du selber können: ("neue Datei" größer "alte Datei * 0.9") ODER ("neue Datei" kleiner "alte Datei * 1.1")
- wenn zutreffend, dann löse ein Ereignis aus...
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Daten"
# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"
# CSV-Dateien auflisten, die nicht älter als 1 Tag sind
# Sortieren nach zuletzt bearbeitet
$CSV = Get-ChildItem $source -Include *.csv | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | Sort-Object LastWriteTime
if ($CSV.length -gt $CSV[1].length * 1.1) {
# hier Code wenn Schwellenwert erreicht
}
else {
# hier Code wenn Schwellenwert nicht erreicht
}
Deine if-Zeile war nicht richtig deswegen habe ich sie angepasst.
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Daten"
# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"
# CSV-Dateien auflisten, die nicht älter als 1 Tag sind
# Sortieren nach zuletzt bearbeitet
$CSV = Get-ChildItem $source -Include *.csv | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | Sort-Object LastWriteTime
if ($CSV.length -gt $CSV[1].length * 1.1) {
Send-MailMessage -From 'von@adresse.hier' -To 'zu@adresse.hier' -Subject 'Titel Hier' -Body 'Text hier' -SmtpServer 'SMTPserver.deine.domain'
}
else {
# hier Code wenn Schwellenwert nicht erreicht
}
So wie ich es geschrieben habe vergleicht es immer die zwei neuesten csv-Dateien im Ordner.
Kann es sein, dass du die Scripte hier blind übernimmst?
Verstehe bitte, was da passiert, ansonsten baut dir hier irgendwo ein Move-Item ein und du wunderst dich, warum Tag für Tag deine Daten verschwinden…
Schaue dir mal Zeile 11 an!
Und was passiert, wenn dein Vergleich am Montag gestartet wird? Welche Dateien sollen verglichen werden? Montag mit Sonntag oder Montag mit Freitag?
Verstehe bitte, was da passiert, ansonsten baut dir hier irgendwo ein Move-Item ein und du wunderst dich, warum Tag für Tag deine Daten verschwinden…
Schaue dir mal Zeile 11 an!
Und was passiert, wenn dein Vergleich am Montag gestartet wird? Welche Dateien sollen verglichen werden? Montag mit Sonntag oder Montag mit Freitag?
Kann es sein, dass du die Scripte hier blind übernimmst?
Das ist garantiert der Fall. Gleich kommt die Frage, warum der Server "SMTPserver.deine.domain" nicht existiert
Meine Güte.
Nicht vor das If, sondern eine Zeile davor!
Ich empfehle dir dringen (!!!) diese Linksammlung mal durchzugehen!
Powershell Leitfaden für Anfänger
Ansonsten solltest du dir einen fähigen ITler suchen und dem Geld geben.
Nicht vor das If, sondern eine Zeile davor!
Ich empfehle dir dringen (!!!) diese Linksammlung mal durchzugehen!
Powershell Leitfaden für Anfänger
Ansonsten solltest du dir einen fähigen ITler suchen und dem Geld geben.
du hast leider dein Objekt (= Variable) $CSV mit $true überschrieben...
Mal im ernst: Ich/ wir haben kein Problem dir zu helfen, aber wenn man "Informatiker" als Beruf hier angibt, sollte man - unabhängig der Sprache - logisches Programmierverständnis haben. Deine Fehler haben hier nichts mit "Powershell-Anfänger" zu tun, sondern es scheitert ja schon am Verständnis der Logik.
Es bringt dir nichts, wenn wir dir hier ein fertiges Script vorlegen und du nicht mal Ansatzweise versuchst nachzuvollziehen, was dort passiert.
Also:
Mal im ernst: Ich/ wir haben kein Problem dir zu helfen, aber wenn man "Informatiker" als Beruf hier angibt, sollte man - unabhängig der Sprache - logisches Programmierverständnis haben. Deine Fehler haben hier nichts mit "Powershell-Anfänger" zu tun, sondern es scheitert ja schon am Verständnis der Logik.
Es bringt dir nichts, wenn wir dir hier ein fertiges Script vorlegen und du nicht mal Ansatzweise versuchst nachzuvollziehen, was dort passiert.
Also:
- Deine Zeile 15 ist quatsch. du hast dadurch die Daten, die du in Zeile 17 nutzen willst, gelöscht.
- deine If-Abfrage ist unvollständig. du prüfst nur, wenn die jüngere Datei um 10% größer ist. was ist aber, wenn die jüngere Datei 20% weniger Inhalt hat?
- Für Zeile 7 musst du noch den Wochentag ermitteln. Wenn dieser ein Montag ist, musst du logischerweise 3 Tage abziehen: (get-date).DayOfWeek. Das in eine If-Abfrage einbauen und gut.
Mach doch mal eines nach dem anderen...
Himmel...
DayofWeek gibt dir einen Integer-Wert zurück: https://docs.microsoft.com/de-de/dotnet/api/system.dayofweek?view=net-6. ...
mach also erst einmal nur ein
Und schaue was passiert. Jetzt kannst du danach prüfen:
So hangelt man sich langsam an neue Möglichkeiten durch.
Welche Programmiersprachen hast du bisher als Informatiker verwendet?
C++, C#, PHP, Java, Delphi, Cobol, Python, RPG, ...?
Himmel...
if ((get-date).DayOfWeek == DayOfWeek.Monday) {
(Get-Date).AddDays(-3)
}
else
{
}
mach also erst einmal nur ein
$dow = (get-date).DayOfWeek
Write-Host "Datum: $(Get-Date)"
Write-Host "Wochentag: $dow"
Und schaue was passiert. Jetzt kannst du danach prüfen:
if ($dw -eq 1){
$dt = (Get-Date).AddDays(-3)
} elseif ($dw -eq 0) {
$dt = (Get-Date).AddDays(-2)
} else {
$dt = (Get-Date).AddDays(-1)
}
Write-Host $dt
So hangelt man sich langsam an neue Möglichkeiten durch.
Welche Programmiersprachen hast du bisher als Informatiker verwendet?
C++, C#, PHP, Java, Delphi, Cobol, Python, RPG, ...?
Dann solltest du dich als Integrator mal mit der Powershell weiter beschäftigen
Und nochmal. Programmieren ist das eine, Sachen blind und ohne den Versuch nachzuvollziehen, was da passiert das andere.
Wer erzeugt dir eigentlich die CSV-Dateien?
So, jett, wo das klappt, setzt du bei $file1 folgendes ein:
Und lässt dir NACH @files mal ein
ausgeben.
Und nochmal. Programmieren ist das eine, Sachen blind und ohne den Versuch nachzuvollziehen, was da passiert das andere.
Wer erzeugt dir eigentlich die CSV-Dateien?
So, jett, wo das klappt, setzt du bei $file1 folgendes ein:
$file1 = "SERVER_PHYS__$($dt.ToString("yyyy.MM.dd")).csv"
Und lässt dir NACH @files mal ein
write-Host $file1
write-Host $file2
Noch ein Tipp: Du musst nicht immer alles zitieren, das stört den Lesefluss. Zitiere da, wo es sinnvoll ist!
Ansonsten:
Zeile 4 bis 7 kannst du weglassen bzw. was passiert, sollte jemand am Sonntag mal dein Script ausführen?
Ab jetzt sollte das Script erst einmal durchlaufen. Wobei du die If-Prüfung mit den 10 % noch abfrühstücken/ korrigieren musst:
Es gibt zwei Wege. Variante einst kennst du bereits (s. oben mit * 0.9 und *1.1) Variante zwei wäre
Edit:
Ansonsten:
Zeile 4 bis 7 kannst du weglassen bzw. was passiert, sollte jemand am Sonntag mal dein Script ausführen?
Ab jetzt sollte das Script erst einmal durchlaufen. Wobei du die If-Prüfung mit den 10 % noch abfrühstücken/ korrigieren musst:
Es gibt zwei Wege. Variante einst kennst du bereits (s. oben mit * 0.9 und *1.1) Variante zwei wäre
$delta = $CSV.length/ $CSV[1].length
if ($delta -gt 1.1 -or $delta -lt 0.9) {
Write-Host "Jippie ya ye, Schweinebacke"
} else {
write-host "mächtiges badabum"
}
Edit:
Habs hinbekommen, dass es 3 Tage abzieht. Ich wusste nicht, dass die Tage mit Zahlen vergeben werden: Tage in PowerShell
Und deswegen sucht man nach Funktionen/ Methoden, und liest sich die Beschreibungen durch, bevor man sie blind anwendet. Oder spielst du als Systemintegrator auch immer blind die Firmwares ein? Es soll vorkommen, dass ein Hersteller angibt "vor dem Update die Config sichern, weil danach alles gelöscht wird. Der Import der alten Config sorgt für eine Konvertierung und Übernahme der Einstellungen"... Also immer erst lesen und dann umsetzen
Letzter Versuch:
Weil Zeile 17 schon nicht funktioniert (hättest du mit einem
Zudem würde ICH nicht das Verzeichnis
- Morgen wird dein Script auf die Nase fallen, weil $dt leer ist
- Zeile 17 ist falsch. @files kommt nicht zum Einsatz und du prüfst weiterhin auf Dateien, die maximal 1 Tag alt sind. Und deshalb ist dein Objekt $CSV auch leer
- Zeile 23 greifst du nicht auf die $delta-Variable zurück
Weil Zeile 17 schon nicht funktioniert (hättest du mit einem
write-host $CSV
leicht herausbekommen) fällt alles andere auf die Nase.Zudem würde ICH nicht das Verzeichnis
C:\Users\Public\CSV-Dateien
verwenden.
https://www.google.de/search?q=powershell+logging
und ich weise noch mal darauf hin, dass das Verzeichnis C:\Users\Public absolut ungeeignet ist.
Lege ein Verzeichnis auf C:\ an, welches SCRIPTING lautet und arbeite dort!
und ich weise noch mal darauf hin, dass das Verzeichnis C:\Users\Public absolut ungeeignet ist.
Lege ein Verzeichnis auf C:\ an, welches SCRIPTING lautet und arbeite dort!
Ich möchte den prozentualen Unterschied zwischen den beiden CSV-Dateien aufrunden.
https://gprivate.com/5zm1w...erhalte eine Fehlermeldung.
sehe keine FehlermeldungEdit (ungetestet):
Write-Output "Nicht erreicht:
$($CSV.FileName): $($CSV.length)
$($CSV[1].FileName): $($CSV[1].length)
Abweichung (%): " + [math]::Round(($delta * 100), 2 )
Mit welchem Befehl kann ich das Script stoppen oder error ausgeben, wenn der aktuelle CSV-Datei im Verzeichnis
fehlt.Prüfe mit Test-Path(), ob beide Dateien existieren.
also ein
if(Test-Path ... -and -Test-Path ... ) { }
Gruß
em-pie
Das kann nicht funktionieren.
du hast zum Testen das gesamte Objekt angegeben.
Du musst aber das richtige Property des Objektes ansprechen. Keine Programmiersprache der Welt weiss sonst, was du genau vergleichen/ testen willst.
Mit ein paar Properties hast du ja oben schon gearbeitet:
.LastWriteTime
.Name
.Length
hier gibt es weitere:
https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell. ...
Und du musst mit einem
edit: beschäftige dich UNBEDINGT mit der objektorientierten Programmierung, willst du mit PowerShell (oder anderen OOP-Sprachen) fortfahren. oder einen Dienstleister/ Freelancer einkaufen
du hast zum Testen das gesamte Objekt angegeben.
Du musst aber das richtige Property des Objektes ansprechen. Keine Programmiersprache der Welt weiss sonst, was du genau vergleichen/ testen willst.
Mit ein paar Properties hast du ja oben schon gearbeitet:
.LastWriteTime
.Name
.Length
hier gibt es weitere:
https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell. ...
Und du musst mit einem
-and
innerhalb eines if arbeiten. Du willst /musst ja prüfen, dass BEIDE Dateien existieren.# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"
# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.txt"
if ($dw -eq 1){
$dt = (Get-Date).AddDays(-3)
} elseif ($dw -eq 0) {
$dt = (Get-Date).AddDays(-2)
} else {
$dt = (Get-Date).AddDays(-1)
}
$file1 = "SERVER_PHYS__$($dt.ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
$Files = @($file1, $file2)
# CSV-Dateien werden abgrufen
$CSV = Get-ChildItem "$Source\*.csv" -Include $Files
# Wenn beide Dateien existieren...
if((Test-Path -Path $CSV.FullName) -and (Test-Path -Path $CSV[1].FullName)) {
# Neuste CSV mit gestrigen anhand der vordefinierten Schwellenwert mit If-Abfrage vergleichen
$delta = $CSV.length/ $CSV[1].length
if ($delta -gt 1.1 -or $delta -lt 0.9) {
Write-Output "Schwellenwert erreicht:
$delta %" $CSV.length "$Files" $CSV[1].length
} else {
Write-Output "Nicht erreicht:
$delta % $Files"
}
} else {
Write-Output "Mindestens eine Datei fehlt:
$CSV.Name
$CSV[1].Name "
}
edit: beschäftige dich UNBEDINGT mit der objektorientierten Programmierung, willst du mit PowerShell (oder anderen OOP-Sprachen) fortfahren. oder einen Dienstleister/ Freelancer einkaufen
Warum hast du die Fehlermeldung gelöscht?
#
Das ist ja EINDEUTIG. Deine $CSV ist einfach leer.
um zu prüfen was passiert, baut man ein wenig debugging ein:
da stellt man fest, dass auch hier schon ein Fehler in Zeile 11 erscheint.
Nun lässt man das -Include einmal weg:
und stellt fest, dass er dann Dateien findet
Also ist das Problem das -Include.
somit sucht man nach der Ursache/ Alternativen, die da wie folgt lutet:
Und schon läuft dein Script.
Über die Form deines Loggings kann man streiten. ICH würde das anders lösen....
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In H:\tmp\ps\11.ps1:46 Zeichen:4
+ if((Test-Path -Path $CSV.FullName) -and (Test-Path -Path $CSV[1].F ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) , RuntimeException
+ FullyQualifiedErrorId : NullArray
Das ist ja EINDEUTIG. Deine $CSV ist einfach leer.
um zu prüfen was passiert, baut man ein wenig debugging ein:
...
$file1 = "SERVER_PHYS__$dt.CSV"
$file2 = "SERVER_PHYS__$dt3.CSV"
$Files = @($file1, $file2)
$Files
# CSV-Dateien werden abgrufen
$CSV = Get-ChildItem $Source -Include @Files
write-Host "Anzahl gefundener Dateien: " ($CSV | Measure).Count
write-Host $CSV.Name ": " $CSV.length
write-Host $CSV[1].Name ": " $CSV[1].length
# Wenn beide Dateien existieren...
if((Test-Path -Path $CSV.FullName) -and (Test-Path -Path $CSV[1].FullName)) {
...
}
Nun lässt man das -Include einmal weg:
$CSV = Get-ChildItem $Source
Also ist das Problem das -Include.
somit sucht man nach der Ursache/ Alternativen, die da wie folgt lutet:
$CSV = Get-ChildItem $Source | Where-Object {$_.Name -eq $file1 -or $_.Name -eq $file2} | Sort-Object Name
Und schon läuft dein Script.
Über die Form deines Loggings kann man streiten. ICH würde das anders lösen....
So wie du das gemacht hast würde der Vergleich von gestern und heute rausfallen
Schusseligkeit meinerseits, hatte da etwas versucht und beim C&P hierrüber nicht wieder zurück angepasst.Zitat von @Urfali:
Problem habe ich gelöst
Problem habe ich gelöst
# CSV-Dateien werden abgrufen
$CSV = Get-ChildItem "$Source\*.csv" -Include $Files
# Wenn beide Dateien existieren...
if ($CSV.Length -eq 2) {
klappt bei mir zwar nicht, aber nungut... Hauptsache du bist glücklich