urfali
Goto Top

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.

Content-Key: 3065449376

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

Printed on: May 2, 2024 at 21:05 o'clock

Member: TK1987
TK1987 Jun 13, 2022 at 12:57:47 (UTC)
Goto Top
Moin,

# 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
Member: Urfali
Urfali Jun 13, 2022, updated at Jun 23, 2022 at 11:36:41 (UTC)
Goto Top
..
Member: em-pie
em-pie Jun 13, 2022 at 13:56:44 (UTC)
Goto Top
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 face-wink

Gruß
em-pie
Mitglied: 148523
148523 Jun 13, 2022 at 14:18:49 (UTC)
Goto Top
Damit der TO auch versteht wer oder was Code Tags sind!
Formatting instructions in the posts
...und das sie mit dem "Bearbeiten" Knopf auch nachträglich noch funktionieren...
Member: Urfali
Urfali Jun 13, 2022, updated at Jun 23, 2022 at 11:37:01 (UTC)
Goto Top
..
Mitglied: 148523
148523 Jun 13, 2022 at 14:50:55 (UTC)
Goto Top
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...
Member: em-pie
em-pie Jun 13, 2022 updated at 15:19:12 (UTC)
Goto Top
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.

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.
Member: TK1987
TK1987 Jun 14, 2022 updated at 05:59:38 (UTC)
Goto Top
Moin,

Zitat von @em-pie:
$file1 = "SERVER_PHYS__$((Get-Date).AddMonths(-1).ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
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.
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  
So wird dann einfach immer die aktuellste und die älteste Datei innerhalb des Monats gewählt.

Gruß Thomas
Member: Urfali
Urfali Jun 14, 2022, updated at Jun 23, 2022 at 11:37:23 (UTC)
Goto Top
..
Member: em-pie
em-pie Jun 14, 2022 at 06:19:04 (UTC)
Goto Top
Zitat von @TK1987:

Moin,

Zitat von @em-pie:
$file1 = "SERVER_PHYS__$((Get-Date).AddMonths(-1).ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
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.
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.

Gruß Thomas
Gruß
em-pie
Member: Urfali
Urfali Jun 14, 2022 at 06:33:41 (UTC)
Goto Top
Zitat von @em-pie:

Zitat von @TK1987:

Moin,

Zitat von @em-pie:
$file1 = "SERVER_PHYS__$((Get-Date).AddMonths(-1).ToString("yyyy.MM.dd")).csv"
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"
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.
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.

Gruß Thomas
Gruß
em-pie

Die CSV-Dateien kommen nur von Montag bis Freitag rein!
Member: Urfali
Urfali Jun 14, 2022 at 07:40:28 (UTC)
Goto Top
Ich möchte nicht das alle Werte verglichen werden sollen. Wie kann ich einzelne Werte auswählen. Ich kenne nur die -Property als Befehl. Aber in welcher Zeile muss ich das anwenden, damit es funktioniert?
Member: TK1987
TK1987 Jun 14, 2022 at 07:52:18 (UTC)
Goto Top
Moin,

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.

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.
Member: Urfali
Urfali Jun 14, 2022 at 08:05:37 (UTC)
Goto Top
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  
#Zieldatei
$Target = "C:\Users\Public\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" | Where-Object LastWriteTime -gt (Get-Date).AddMonths(-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  

So hat es geklappt. Aber Es gibt alle Werte als Änderung zurück und nicht dir einzelnen Werte, die ich gerne habe möchte.

In einer Zeile sind die Namen der Werte definiert: ID SERIAL_NO CPU_CORES CPU_NAME CPU_MANUFACTURER etc.... . Darunter liegen die Werte wie z. B bei ID: 19419219 oder CPU_cores: 4


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

So wie dieser Code besteht gibt das Script jede Zeile an, das will ich nicht haben sondern nach einzelen Werte die Unterschiede zwischen beiden CSV-Dateien anzeigen lassen
Member: Urfali
Urfali Jun 14, 2022, updated at Jun 23, 2022 at 11:41:43 (UTC)
Goto Top
Zitat von @TK1987:

Moin,

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.

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.

zum Beispiel sieht es so aus an beiden CSV Dateien. Nun soll beiden CSV-Dateien verglichen werden, welche werte sich geändert haben. Nur die Werte, die geändert wurden sollen ausgegeben werden bzw. ich will die Namen dieser Werte wie in der Zeile 1 zu sehen selber auswählen können.
Member: TK1987
TK1987 Jun 14, 2022 updated at 09:11:42 (UTC)
Goto Top
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.

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

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
Member: Urfali
Urfali Jun 14, 2022 updated at 11:24:32 (UTC)
Goto Top
Zitat von @TK1987:

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.

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

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

Ich bekomme als Output " " bei der AusgabeDatei.csv. Ich habe vergessen zu erwähnen, dass ich die beiden CSV-Dateien mit Excel unter Daten->Text in Spalten geändert und als Trennzeichen Komme gesetzt habe. Das habe ich vergessen zu erwähnen. Hab die Dateien wieder im alten Zustand gesetzt ohne Trennzeichen oder jenes.

Aktuell sieht die CSV-Datei unübersichtlich aus, da ich die Trennzeichen weggelassen habe.

Es funktioniert nicht richtig. Ich habe versucht anhand ID und Serial_no zu filtern, trotzdem spuckt mir es die komplette Zeile aus mit den Namen von den Werte also die Zeile 1
Member: Urfali
Urfali Jun 14, 2022 at 11:51:26 (UTC)
Goto Top
$csv1 = "C:\Users\Public\CSV-Dateien\SERVER_PHYS__2022.05.02.csv"  


Import-CSV  -Path $csv1 -Delimiter ';'  

$csv2 = "C:\Users\Public\CSV-Dateien\SERVER_PHYS__2022.06.10.csv"   

Import-CSV  -Path $csv2 -Delimiter ';'  

Compare -ReferenceObject $csv1 -DifferenceObject $csv2 -Property ID, SERIAL_NO

Ich habe so versucht die CSV-Dateien zu vergleichen, leider bekomme ich als Output nicht die unterschiede raus face-sad. Es wird mir nur die ganze CSV-Datei angezeigt ohne Trennzeichen.
Member: em-pie
em-pie Jun 14, 2022 at 11:59:31 (UTC)
Goto Top
Moin,

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.
Member: Urfali
Urfali Jun 14, 2022 at 12:17:21 (UTC)
Goto Top
$csv1 = "C:\Users\Public\CSV-Dateien\SERVER_PHYS__2022.05.02.csv"  
Import-CSV  -Path $csv1 -Delimiter ';'  

$csv2 = "C:\Users\Public\CSV-Dateien\SERVER_PHYS__2022.06.10.csv"   
Import-CSV  -Path $csv2 -Delimiter ';'  

$result =  Compare -ReferenceObject $csv1 -DifferenceObject $csv2 -Property ID, SERIAL_NO
$result | Select ID, SERIAL_NO | export-CSV -Delimiter ';' -Encoding UTF8 $Target -NoTypeInformation  

Ich bekomme immer noch die Unterschiede nicht raus. Es werden alle Werte angezeigt
Member: Urfali
Urfali Jun 15, 2022, updated at Jun 23, 2022 at 11:42:07 (UTC)
Goto Top
..
Member: em-pie
em-pie Jun 15, 2022 at 15:14:14 (UTC)
Goto Top
Moin,

dann streng mal deine Rübe an face-smile

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...
Member: Urfali
Urfali Jun 17, 2022 at 08:00:22 (UTC)
Goto Top
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  
#Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

$file1 = "SERVER_PHYS__$((Get-Date).AddDays(-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 Tag sind
$CSV = Get-ChildItem "$Source\*.csv" | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | sort Name  


# Neuste CSV mit ältester anhand der vordefinierten Schwellenwert vergleichen, Ergebnis in Zieldatei schreiben
Compare (Get-ChildItem $CSV[-1]) (Get-ChildItem $CSV) |

  if ((Get-childitem $$CSV[-1]).length -gt (Get-childitem $CSV).length *0.9) { 
	Write-Output "Info: Der Schwellenwert wurde erreicht. Bitte vergleichen Sie die CSV-Dateien!"   
    
    Export-CSV -Delimiter ';' -Encoding UTF8 $Target -NoTypeInformation  
} 
else {
	 "Trifft nicht zu."   
}    

Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:15 Zeichen:1
+ Compare (Get-ChildItem $CSV[-1]) (Get-ChildItem $CSV) |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NullArray
 
else : Die Benennung "else" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern   
enthalten), und wiederholen Sie den Vorgang.
In Zeile:22 Zeichen:1
+ else {
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (else:String) , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException


Ich bekomme diese Fehlermeldung raus.
Mitglied: 3063370895
3063370895 Jun 18, 2022 at 05:55:36 (UTC)
Goto Top
# 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
} 
Member: Urfali
Urfali Jun 18, 2022 at 09:25:34 (UTC)
Goto Top
Zitat von @chaot1coz:

# 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 * 0.9) { 
    # hier Code wenn Schwellenwert erreicht
} 
else {
    # hier Code wenn Schwellenwert nicht erreicht
} 

Für den "# hier Code wenn... " will ich ein output haben, dass es mich per Mail benachrichtigt oder als Ziel Target Ordner eine xls oder Word mir Benachrichtigung ausgibt. Am besten wäre es mit der Mail Benachrichtigung.

Habe ich die "if Zeile" richtig geschrieben? Also es soll beide csv Dateien vergleichen und wenn die Dateigröße vom vorherigen Tag zum heutigen Tag einen unterschied in Höhe von 10 Prozent gibt, soll ess mir ein output geben also Benachrichtigung.
Mitglied: 3063370895
3063370895 Jun 18, 2022 at 11:12:02 (UTC)
Goto Top
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
} 
Member: Urfali
Urfali Jun 18, 2022 at 11:59:56 (UTC)
Goto Top
Zitat von @chaot1coz:

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 * 0.9) { 
    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
} 

Ich sehe nirgendwo wo das Script automatisch die csv Dateien vergleichen soll die mit der Name "SERVER_PHYS__XXXX.XX.XX.csv" haben. Es soll immer von gestrigen und heutigen csv mit der Dateiname SERVER_PHYS__XXXX.XX.XX.csv vergleichen also Beispiel

SERVER_PHYS__2022.05.17.csv 5KB gestern
SERVER_PHYS__2022.05.18.csv 10KB heute

Die csv Dateien kommen täglich nur von Montag bis Freitag in den Quellorder Ordner rein un das Script soll anhand Dateigröße heutigen und gestrigen Vergleichen und falls der schwellenwert erreicht per Email benachrichtigt werden
Mitglied: 3063370895
3063370895 Jun 18, 2022 at 12:07:27 (UTC)
Goto Top
So wie ich es geschrieben habe vergleicht es immer die zwei neuesten csv-Dateien im Ordner.
Member: em-pie
em-pie Jun 18, 2022 at 12:09:09 (UTC)
Goto Top
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?
Mitglied: 3063370895
3063370895 Jun 18, 2022 at 12:14:07 (UTC)
Goto Top
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 face-smile
Member: Urfali
Urfali Jun 18, 2022 at 15:23:44 (UTC)
Goto Top
Zitat von @chaot1coz:

So wie ich es geschrieben habe vergleicht es immer die zwei neuesten csv-Dateien im Ordner.

das Problem ist, das in diesem Ordner auch andere CSV Dateien sind, also nicht nur SERVER_PHYS__XXXX.XX.XX.csv sondern auch z.B Application__XXXX.XX.XX.csv oder Network__XXXX.XX.XX.cs. Deswegen will ich so haben, dass es nur bestimmte CSV-Dateien von heute und gestern anhand der Datengröße vergleicht.

Vielen Dank!
Member: Urfali
Urfali Jun 18, 2022 at 15:27:06 (UTC)
Goto Top
Es soll z.b von Montag (alt) und Dienstag (neu) vergleichen. Dann am nächsten Tag Dienstag (alt) mit Mittwoch (neu) vergleichen ... Freitag (alt) und Montag (neu) ...
Member: Urfali
Urfali Jun 18, 2022 updated at 16:37:49 (UTC)
Goto Top
Zitat von @em-pie:

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?



Es soll z.b von Montag (alt) und Dienstag (neu) vergleichen. Dann am nächsten Tag Dienstag (alt) mit Mittwoch (neu) vergleichen ... Freitag (alt) und Montag (neu) ...
Member: Urfali
Urfali Jun 20, 2022 at 05:17:38 (UTC)
Goto Top
Zitat von @chaot1coz:

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
} 

erhalte diese Fehlermeldung :

Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:10 Zeichen:5
+ if ($CSV.length -gt $CSV[1].length * 1.1) {
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NullArray
Member: em-pie
em-pie Jun 20, 2022 at 06:13:58 (UTC)
Goto Top
Die Meldung besagt, dass deine Variable $CSV leer ist oder nicht alle Dateien erwischt hat.

Mach einfach mal VOR der IF-Abfrage ein $CSV. Dann sollten die Dateien angezeigt werden…
Member: Urfali
Urfali Jun 20, 2022 at 06:23:52 (UTC)
Goto Top
Zitat von @em-pie:

Die Meldung besagt, dass deine Variable $CSV leer ist oder nicht alle Dateien erwischt hat.

Mach einfach mal VOR der IF-Abfrage ein $CSV. Dann sollten die Dateien angezeigt werden…

bekomme diese fehlermeldung:

In Zeile:10 Zeichen:7
+  $CSV if ($CSV.length -gt $CSV[1].length * 1.1) {
+       ~~
Unerwartetes Token "if" in Ausdruck oder Anweisung.  
    + CategoryInfo          : ParserError: (:) , ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken
Member: em-pie
em-pie Jun 20, 2022 at 06:34:25 (UTC)
Goto Top
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.
Member: Urfali
Urfali Jun 20, 2022 at 06:42:14 (UTC)
Goto Top
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Daten"  

# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

$file1 = "SERVER_PHYS__$((Get-Date).AddDays(-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 Tag sind
$CSV = Get-ChildItem $source -Include *.csv | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | Sort-Object LastWriteTime

# Neuste CSV mit ältester anhand der vordefinierten Schwellenwert mit IF-Else vergleichen 
 $CSV =  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
} 

die Fehlermeldung:

Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:15 Zeichen:14
+  $CSV =  if ($CSV.length -gt $CSV[1].length * 1.1) {
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NullArray

im Source Ordner sind 4 CSV Dateien: Beispiel:
SERVER_PHYS__2022.05.02.csv
SERVER_PHYS__2022.06.10.csv
SERVER_PHYS__2022.06.16.csv
SERVER_PHYS__2022.06.17.csv

es soll normalerweise nun die CSV Datei vom 16 (alt) und 17 (neu) anhand der Datengröße vergleichen müssen.

Wichtig ist, dass in diesem Ordner auch andere CSV Dateien sind. soweit ich aus dem code lesen kann, filter es nach der Dateiname "SERVER_PHYS_yyyy.MM.dd". Mir ist wichtig, dass es nur bestimmte CSV-Dateien aus dem Ordner vergleichen soll wie z. B siehe oben "Server_PHYS_yyyy.MM.dd".

$file1 = "SERVER_PHYS__$((Get-Date).AddDays(-1).ToString("yyyy.MM.dd")).csv"  
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"  
$Files = @($file1, $file2)
Member: Urfali
Urfali Jun 20, 2022 at 07:15:10 (UTC)
Goto Top
Zitat von @em-pie:

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.

sollte es so passen?

# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Daten"  

# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

$file1 = "SERVER_PHYS__$((Get-Date).AddDays(-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 Tag sind
$CSV = Get-ChildItem $source -Include *.csv | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | Sort-Object LastWriteTime 

# Neuste CSV mit ältester anhand der vordefinierten Schwellenwert mit IF-Abfrage vergleichen
$CSV = $true

if ($CSV.length -gt $CSV[1].length * 1.1) { 
    Write-Output "info: Schwellenwert erreicht."   
} 
else {
   Write-Output "Nicht erreicht."  
} 
Member: Urfali
Urfali Jun 20, 2022 at 07:36:09 (UTC)
Goto Top
Es funktioniert nicht so wie ich es gerne haben wollte. Der Schwellenwert zwischen 2022_06.16 (alt) und 2022_06.17 (neu) hat eigentlich von der Datengröße nicht erreicht, jedoch bekomme ich als output: Schwellenwert erreicht face-sad. Es sind ja wohl keine 10 % Prozent Abweichungen zwischen beiden CSV-Dateien.
Member: em-pie
em-pie Jun 20, 2022 at 07:46:56 (UTC)
Goto Top
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:
  1. Deine Zeile 15 ist quatsch. du hast dadurch die Daten, die du in Zeile 17 nutzen willst, gelöscht.
  2. 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?
  3. 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.
Member: Urfali
Urfali Jun 20, 2022 at 09:44:11 (UTC)
Goto Top
Zitat von @em-pie:

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:
  1. Deine Zeile 15 ist quatsch. du hast dadurch die Daten, die du in Zeile 17 nutzen willst, gelöscht.
  2. 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?
  3. 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.

Ich komme leider nicht weiter face-sad


# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  

# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

if ((get-date).DayOfWeek == DayOfWeek.Monday)  {

    (Get-Date).AddDays(-3)
}

else
{
   
}

$file1 = "SERVER_PHYS__$((Get-Date).AddDays(-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 Tag sind
$CSV = Get-ChildItem $source -Include *.csv | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | Sort-Object LastWriteTime 

# Neuste CSV mit gestrigen anhand der vordefinierten Schwellenwert mit IF-Abfrage vergleichen
$CSV 

if ($CSV.length -lt $CSV[1].length * 1.1) { 
   Write-Output "info: Schwellenwert erreicht."   
} 

if ($CSV[1].length -gt $CSV.length * 1.1) { 
   Write-Output "info: Schwellenwert erreicht."   
} 

else {
   Write-Output "Nicht erreicht."  
} 




= : Die Benennung "=" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und   
wiederholen Sie den Vorgang.
In Zeile:7 Zeichen:27
+ if ((get-date).DayOfWeek == DayOfWeek.Monday)  {
+                           ~
    + CategoryInfo          : ObjectNotFound: (=:String) , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:27 Zeichen:5
+ if ($CSV.length -lt $CSV[1].length * 1.1) {
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:31 Zeichen:5
+ if ($CSV[1].length -gt $CSV.length * 1.1) {
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NullArray
Member: em-pie
em-pie Jun 20, 2022 updated at 10:01:20 (UTC)
Goto Top
Mach doch mal eines nach dem anderen...

Himmel...
if ((get-date).DayOfWeek == DayOfWeek.Monday)  {

    (Get-Date).AddDays(-3)
}

else
{
   
}
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
$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, ...?
Member: Urfali
Urfali Jun 20, 2022 at 10:17:15 (UTC)
Goto Top
ich bin kein Anwendungsentwickler sondern Systemintegrator! Es ist lange her, dass ich mal programmiert habe. Daher bitte ich um dein Verständnis !
Member: Urfali
Urfali Jun 20, 2022 at 10:35:10 (UTC)
Goto Top
Zitat von @em-pie:

Mach doch mal eines nach dem anderen...

Himmel...
if ((get-date).DayOfWeek == DayOfWeek.Monday)  {

    (Get-Date).AddDays(-3)
}

else
{
   
}
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
$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, ...?

Habs hinbekommen, dass es 3 Tage abzieht. Ich wusste nicht, dass die Tage mit Zahlen vergeben werden: Tage in PowerShell
if ((get-date).DayOfWeek -eq 1) {
 $dt = (Get-Date).AddDays(-3)
}

 else {

}

Write-Host $dt
17.06.2022 12:32:36
Member: em-pie
em-pie Jun 20, 2022 at 10:48:34 (UTC)
Goto Top
Dann solltest du dich als Integrator mal mit der Powershell weiter beschäftigen face-wink
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
ausgeben.
Member: Urfali
Urfali Jun 20, 2022 updated at 11:00:54 (UTC)
Goto Top
Zitat von @em-pie:

Dann solltest du dich als Integrator mal mit der Powershell weiter beschäftigen face-wink
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
ausgeben.

Die Codes dahinter verstehe ich alles. Aber ich weiß manchmal nicht wie ich darauf kommen kann. Bekomme das hier raus:

if ((get-date).DayOfWeek -eq 1) {
 $dt = (Get-Date).AddDays(-3)
}

 else {

}

$file1 = "SERVER_PHYS__$($dt.ToString("yyyy.MM.dd")).csv"  
$file2 = "SERVER_PHYS__$(Get-Date -Format "yyyy.MM.dd").csv"  
$Files = @($file1, $file2)

write-Host $file1
write-Host $file2
SERVER_PHYS__2022.06.17.csv
SERVER_PHYS__2022.06.20.csv
Member: em-pie
em-pie Jun 20, 2022 updated at 11:14:16 (UTC)
Goto Top
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

 $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 face-wink
Member: Urfali
Urfali Jun 20, 2022 at 11:26:07 (UTC)
Goto Top
Bekomme wieder die Fehlermeldung: Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
 # Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  

# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

if ((get-date).DayOfWeek -eq 1)  {

   $dt = (Get-Date).AddDays(-3)
}


$file1 = "SERVER_PHYS__$($dt.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 Tag sind
$CSV = Get-ChildItem $source -Include *.csv | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1).Date | Sort-Object LastWriteTime 

# Neuste CSV mit gestrigen anhand der vordefinierten Schwellenwert mit IF-Abfrage vergleichen

 $CSV = $CSV.length/ $CSV[1].length

if ($CSV -gt 1.1 -or $CSV -lt 0.9) {
  Write-Host "info: Schwellenwert erreicht."  
} else {
 write-host "Nicht erreicht."  
}
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:22 Zeichen:2
+  $CSV = $CSV.length/ $CSV[1].length
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : NullArray
 
info: Schwellenwert erreicht.
Member: em-pie
em-pie Jun 20, 2022, updated at Jun 22, 2022 at 09:04:05 (UTC)
Goto Top
Weil du dir die Variable $CSV mit deinen ganzen Objekten schon wieder gelöscht hast. Zeile 22

Du solltest die Fehlermeldungen nochmal lesen und versuchen zu verstehen, was da passiert.
Ich bin jetzt raus...
Member: Urfali
Urfali Jun 20, 2022, updated at Jun 22, 2022 at 09:04:15 (UTC)
Goto Top
Welche Variablen haben ich den gelöscht?

$delta = $CSV.length / $CSV[1].length

if ($CSV -gt 1.1 -or $CSV -lt 0.9) {
  Write-Host "info: Schwellenwert erreicht."  
} else {
 write-host "Nicht erreicht."  
}
Member: Urfali
Urfali Jun 20, 2022, updated at Jun 23, 2022 at 11:43:02 (UTC)
Goto Top
..
Member: em-pie
em-pie Jun 20, 2022, updated at Jun 22, 2022 at 09:04:38 (UTC)
Goto Top
Letzter Versuch:

  • 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.
Member: Urfali
Urfali Jun 21, 2022, updated at Jun 23, 2022 at 11:43:18 (UTC)
Goto Top
..
Member: Urfali
Urfali Jun 21, 2022 at 07:25:20 (UTC)
Goto Top
Den Fehler habe ich nun behoben. Jedoch der Output ist falsch

# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  

# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

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   

# Neuste CSV mit gestrigen anhand der vordefinierten Schwellenwert mit IF-Abfrage vergleichen
$CSV 


if ($CSV.length -lt $CSV[-1].length * 1.1) { 
   write-host "info: Schwellenwert erreicht."   
} 

if ($CSV[-1].length -gt $CSV.length * 1.1) { 
    write-host "info: Schwellenwert erreicht."   
} 
else {
    write-host "Nicht erreicht."  
} 


Output:

    Verzeichnis: C:\Users\Public\CSV-Dateien


Mode                 LastWriteTime         Length Name                                                                                                                                                                                  
----                 -------------         ------ ----                                                                                                                                                                                  
-a----        20.06.2022     16:22          26793 SERVER_PHYS__2022.06.20.csv                                                                                                                                                           
-a----        07.06.2022     16:22          26793 SERVER_PHYS__2022.06.21.csv                                                                                                                                                           
info: Schwellenwert erreicht.
Nicht erreicht.
Member: Urfali
Urfali Jun 21, 2022 at 07:29:21 (UTC)
Goto Top
Diesen Fehler habe ich auch behoben. If-Abfrage war falsch.

# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  

# Zieldatei
$Target = "C:\Users\Public\AusgabeDatei.csv"  

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   

# 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-Host "info: Schwellenwert erreicht."   
} else {
 write-host "Nicht erreicht."  
}
Member: Urfali
Urfali Jun 21, 2022 at 08:24:24 (UTC)
Goto Top
Ich benötige noch logs. Es soll bei jedem Durchlauf (täglich) logs erstellen , ob es überhaupt erfolgreich durchgelaufen ist, wenn ja, soll es mir die CSV-Dateien ausgeben, die verglichen wurden sowohl auch, ob die Schwellenwert erreicht hat

z. B.
    Verzeichnis: C:\Users\Public\CSV-Dateien


Mode         LastWriteTime                                Length Name                                                                                                                                                                                  
----               -------------                                     ------ ----                                                                                                                                                                                  
-a----        20.06.2022     16:22          26793 SERVER_PHYS__2022.06.20.csv                                                                                                                                                           
-a----        07.06.2022     16:22          26793 SERVER_PHYS__2022.06.21.csv          
                                                                                                                                                 
"Schwellenwert erreicht" oder "nicht erreicht"  
Member: em-pie
em-pie Jun 21, 2022 updated at 09:08:20 (UTC)
Goto Top
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!
Member: Urfali
Urfali Jun 21, 2022 at 09:12:00 (UTC)
Goto Top
Zitat von @em-pie:

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!

Ich werde es natürlich das Verzeichnis ändern. Vielen Dank!
Member: Urfali
Urfali Jun 21, 2022 at 10:46:00 (UTC)
Goto Top
Ich möchte den prozentualen Unterschied zwischen den beiden CSV-Dateien aufrunden. Ich hab es mit „{0:X8}“ –f $delta versucht, jedoch klappt es nicht in der Zeile 28 wo Write.ouput steht einzutragen, erhalte eine Fehlermeldung.

Sowie die Werte werden im Output nicht richtig angezeigt, also wie oben wie ich es gerne haben möchte


# 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   

# 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"  
}


 

Output:

Schwellenwert erreicht:


0.454843309679829 %
26793
SERVER_PHYS__2022.06.20.csv SERVER_PHYS__2022.06.21.csv
58906
Member: em-pie
em-pie Jun 21, 2022 updated at 12:23:58 (UTC)
Goto Top
Ich möchte den prozentualen Unterschied zwischen den beiden CSV-Dateien aufrunden.
https://gprivate.com/5zm1w

...erhalte eine Fehlermeldung.
sehe keine Fehlermeldung

Edit (ungetestet):
Write-Output "Nicht erreicht:  
  $($CSV.FileName): $($CSV.length)
  $($CSV[1].FileName): $($CSV[1].length)
 Abweichung (%): " + [math]::Round(($delta * 100), 2 )  
Member: Urfali
Urfali Jun 21, 2022 at 13:05:10 (UTC)
Goto Top
Bei deiner Lösungsweg bekomme ich.
Ich habe auch bereits mit + [math]::Round versucht. hat bei mir auch nicht geklappt

Schwellenwert erreicht:


 : 26793
  : 51816
 Abweichung (%): 
+
[math]::Round
51,7079666512274
2
Member: Urfali
Urfali Jun 21, 2022 at 13:14:22 (UTC)
Goto Top
Aufrunden habe ich gelöst, jedoch nebeneinander geht das komischerweise nicht. Filename konnte ich bisher nicht lösen. face-sad
Write-Output "Schwellenwert erreicht:  

 $($CSV.FileName): $($CSV.length)
 $($CSV[1].FileName): $($CSV[1].length)
 Abweichung (%): "  
 „ {0:P1} “ –f$delta 
} 

Output:

Schwellenwert erreicht:

 : 26793
 : 51816
 Abweichung (%): 
 51,7 % 
Member: em-pie
em-pie Jun 21, 2022 updated at 13:29:39 (UTC)
Goto Top
Probiere mal anstelle von .FileName ein .Name
Member: Urfali
Urfali Jun 21, 2022 at 13:32:20 (UTC)
Goto Top
hatte schon
Zitat von @em-pie:

Probiere mal anstelle von .FileName ein .Name

hatte schon die Lösung danke face-smile
Member: Urfali
Urfali Jun 21, 2022, updated at Jun 23, 2022 at 11:45:20 (UTC)
Goto Top
..
Member: em-pie
em-pie Jun 21, 2022 updated at 14:06:27 (UTC)
Goto Top
SO könnte es aussehen:
$strText = "Schwellenwert erreicht:  
$($CSV.FileName): $($CSV.length)
$($CSV[1].FileName): $($CSV[1].length)
Abweichung: „ {0:P1} “ –f$delta "  

Write-Host $strText
Add-Content $Target -Value $strText
Member: Urfali
Urfali Jun 21, 2022 at 14:52:02 (UTC)
Goto Top
Zitat von @em-pie:

SO könnte es aussehen:
$strText = "Schwellenwert erreicht:  
$($CSV.FileName): $($CSV.length)
$($CSV[1].FileName): $($CSV[1].length)
Abweichung: „ {0:P1} “ –f$delta "  

Write-Host $strText
Add-Content $Target -Value $strText

danke. hab es ein bisschen geändert. passt alles. Mit welchem Befehl kann ich das Script stoppen oder error ausgeben, wenn der aktuelle CSV-Datei im Verzeichnis fehlt.

$strText = "  
$dt
*************************************************************************************************************
Schwellenwert erreicht:
$($CSV.name): $($CSV.length) Byte
$($CSV[1].name): $($CSV[1].length) Byte

Abweichung (%): "+ „ {0:P1} “ –f$delta + ""  


Write-Host $strText

Add-Content $Target -Value $strText 
Member: em-pie
em-pie Jun 21, 2022 at 15:09:05 (UTC)
Goto Top
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
Member: Urfali
Urfali Jun 22, 2022 at 07:38:59 (UTC)
Goto Top
  if (Test-Path $Source -Include $CSV) {
  
    write-host "Old CSV-Datei existiert"  
    }

if  (-Not(Test-Path $Source -Include $CSV))
    {
    write-host "Old CSV-Datei existiert nicht!"  
    }

 if (Test-Path $Source -Include $CSV[1]) {
  
    write-host "New CSV-Datei existiert"  
    }

if  (-Not(Test-Path $Source -Include $CSV[1]))
    {
    write-host "New CSV-Datei existiert nicht!"  
    }


Ausgabe:
Schwellenwert erreicht:
SERVER_PHYS__2022.06.21.csv: 51816 Byte
SERVER_PHYS__2022.06.22.csv: 26793 Byte

Abweichung (%):  193,4 % 
Old CSV-Datei existiert nicht!
New CSV-Datei existiert nicht!

Alte und neue CSV-Datei bestehen, trotzdem zeigt es mir an, dass es nicht existiert face-sad Hab auch statt -not mit "!" versucht.
Member: Urfali
Urfali Jun 22, 2022 at 11:06:34 (UTC)
Goto Top
Wenn die Datei z. B alte oder neue nicht im Ordner ist, bekomme ich die Fehlermeldung (siehe unten).

   If(Test-Path -Path $CSV) {
       Write-Output "$CSV'.csv' exists"  

  } Else {

    Write-Output "$CSV'.csv' doesnt exist"  


}
   If(Test-Path -Path $CSV[1]) {
       Write-Output "$CSV[1]'.csv' exists"  

  } Else {

    Write-Output "$CSV[1]'.csv' doesnt exist"  


}

C:\Users\Public\CSV-Dateien\SERVER_PHYS__2022.06.22.csv'.csv' exists  
Test-Path : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.  
In Zeile:70 Zeichen:23
+    If(Test-Path -Path $CSV[1]) {
+                       ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Test-Path], ParameterBindingValidationException
Member: em-pie
em-pie Jun 23, 2022 updated at 07:08:17 (UTC)
Goto Top
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 -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 face-wink
Member: Urfali
Urfali Jun 23, 2022 at 12:08:12 (UTC)
Goto Top
# Quellordner mit CSV-Dateien
$Source = "C:\Users\Public\CSV-Dateien"  

# Zielordner für Logs
$Target = "C:\Users\Public\Logs.txt"  

$dt2 = Get-Date 

# Vergleich CSV-Dateien nur von Montag bis Freitag 
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.name) -and (Test-Path -Path $CSV[1].name)) {

    # Neuste CSV mit gestrigen anhand der vordefinierten Schwellenwert mit If-Abfrage vergleichen / Ergebnis in Logs.txt schreiben
    $delta = $CSV[1].length/ $CSV.length

    if ($delta -gt 1.1 -or $delta -lt 0.9) {

$strText = "  
$dt2 
*************************************************************************************************************
Schwellenwert erreicht:

$($CSV.name): $($CSV.length) Byte
$($CSV[1].name): $($CSV[1].length) Byte

Abweichung (%): "+ „{0:N2}“ –f($delta*100 -100) + ""  

Write-Host $strText
Add-Content $Target -Value $strText 
    } 

    else {

$strText = "  
$dt2
*************************************************************************************************************
Schwellenwert nicht erreicht:

$($CSV.name): $($CSV.length) Byte
$($CSV[1].name): $($CSV[1].length) Byte

Abweichung (%): "+ „{0:N2}“ –f($delta*100 -100) + ""  

Write-Host $strText
Add-Content $Target -Value $strText 
    } 

} 

else {

$strText = "  
$dt2
*************************************************************************************************************
Mindestens eine CSV-Datei fehlt:
    
    
$($CSV.name)
$($CSV[1].name) "  


Write-Host $strText
Add-Content $Target -Value $strText 
}

wenn ich die alte CSV-Datei lösche bekomme ich halt die Fehlermeldung, dass eine Datei fehlt und die fehlende Datei wird nicht angezeigt. Bisher funktioniert es richtig. Jedoch, wenn ich die alte Datei im Verzeichnis wiederherstelle bekomme ich die gleiche Meldung, dass die Datei fehlt, jedoch wird mir beide Dateien dann angezeigt, also die alte und neue CSV-Datei. Eigentlich falls beide Dateien existieren sollte es dann denn Schwellenwert ausrechnen, jedoch tut es nicht

06/23/2022 14:03:33
*************************************************************************************************************
Mindestens eine CSV-Datei fehlt:
    
    
SERVER_PHYS__2022.06.22.csv
SERVER_PHYS__2022.06.23.csv 
Member: em-pie
em-pie Jun 23, 2022 at 12:52:52 (UTC)
Goto Top
Warum hast du die Fehlermeldung gelöscht?

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)) {
 ...
}
da stellt man fest, dass auch hier schon ein Fehler in Zeile 11 erscheint.
Nun lässt man das -Include einmal weg:
$CSV = Get-ChildItem $Source 
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:
$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....
Member: Urfali
Urfali Jun 23, 2022 at 13:37:03 (UTC)
Goto Top
So wie du das gemacht hast würde der Vergleich von gestern und heute rausfallen. Ich habe es so angepasst, jedoch erhalte ich den gleichen Fehler. face-sad

$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 | Where-Object {$_.Name -eq $file1 -or $_.Name -eq $file2} | Sort-Object Name 

# Wenn beide Dateien existieren...

Fehler:
Test-Path : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.  
In C:\Users\Public\Test report\Untitled6.ps1:35 Zeichen:61
+ ... th -Path $CSV.FullName) -and (Test-Path -Path $CSV[1].FullName)) {
+                                                      ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Test-Path], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.TestPathCommand
Member: Urfali
Urfali Jun 23, 2022 at 15:36:39 (UTC)
Goto Top
Problem habe ich gelöst face-smile

# CSV-Dateien werden abgrufen
$CSV = Get-ChildItem "$Source\*.csv" -Include $Files  

# Wenn beide Dateien existieren...
if ($CSV.Length -eq 2) {
Member: em-pie
em-pie Jun 23, 2022 at 15:45:19 (UTC)
Goto Top
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 face-smile

# 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 face-wink