chgs2011
Goto Top

Dateien Nummern auf Lückenlosigkeit prüfen in Verzeichnis mit Unterverzeichnissen

Hallo zusammen,

ich beziehe mich auf ein damals angesprochenes Thema:
Nummerierte Dateien auf Lückenlosigkeit überprüfen. Fehler in Datei ausgeben!


Vielen Dank für den Ansatz bastla, immer wieder cool was du für Lösungen zauberst.

Wir haben aktuell auch so ein Thema und haben nach einer Lösung von dir gesucht (kommen ja fast alle von dir).

Unsere PDFs liegen in einen Stammverzeichnis auf B:\ mit vielen Unterverzeichnissen je Jahr und Monat und wollen hier prüfen, ob Nummern im Kreis fehlen.

Der Start/Endwert ergibt sich im Grunde aus den Dateien selbst, sprich wenn jemand ein Dokument ablegt, bekam es die Nummer X und am Monatsende haben wir Nummer Y.

Start/Endwert wäre uns aber eigentlich egal und brauchen wir wohl nicht, Hauptsache wir finden evtl. fehlende Nummern.

Schema der Dateibezeichnungen als Beispiel:
"Anleitung D272150.pdf"


Verzeichnisstruktur:
Laufwerk\Jahr\Monat\Kategorie

B:\
B:\2021
B:\2021\01
B:\2021\01\A
B:\2021\01\B
B:\2021\02
B:\2021\02\A
B:\2021\02\B
B:\2021\03
B:\2021\03\A
B:\2021\03\B
...


Wir wollen also prüfen, ob es in allen dieser Verzeichnisse eine fehlende Nummer gibt.

Vielen Dank.

Content-Key: 2108369798

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

Printed on: April 28, 2024 at 04:04 o'clock

Member: TK1987
TK1987 Mar 10, 2022 updated at 14:03:51 (UTC)
Goto Top
Moin,

ohne Anfangs- und Endwert ist das mit Batch kaum realisierbar, da es mit Batch ziemlich Aufwendig ist, aus allen Dateinamen die Nummern herauszufiltern, anschließend Minimum- und Maximumwerte festzulegen und dann noch fehlende zu filtern.

Alleine schon aus Performancegründen wäre hier aber ohnehin Powershell zu empfehlen - damit ist das Ganze auch ohne Start- und Endwert ein klacks.
# Quellverzeichnis
$Source = "B:\"  

# Alle Nummern der PDF-Dateien auflisten
$Num = Get-ChildItem -File -Recurse "$Source\*.pdf" | Where-Object BaseName -Match "\d+$" | Foreach-Object { [int]$Matches.0 }  

# Minimum/Maximumwerte filtern
$min_max = $Num | Measure -Minimum -Maximum

# fehlende Nummern ausgeben
$min_max.Minimum..$min_max.Maximum | Where-Object { $Num -NotContains $_ }

Powershell Leitfaden für Anfänger

Gruß Thomas
Member: chgs2011
chgs2011 Mar 11, 2022 at 07:00:31 (UTC)
Goto Top
Hallo Thomas,

ich wäre auch für PS offen, habe damit aber null Erfahrung, man weis nur dass man mit viel weniger Coding oft auskommt und es performanter ist.

Habe dein Test mal versucht, er wirft mir aber einen INT32 Fehler:
Der Wert "009510089801" kann nicht in den Typ "System.Int32" konvertiert werden.
Fehler: "Der Wert für einen Int32 war zu groß oder zu klein."
Member: TK1987
TK1987 Mar 11, 2022 at 07:20:43 (UTC)
Goto Top
Zitat von @chgs2011:
Habe dein Test mal versucht, er wirft mir aber einen INT32 Fehler:
Der Wert "009510089801" kann nicht in den Typ "System.Int32" konvertiert werden.
Fehler: "Der Wert für einen Int32 war zu groß oder zu klein."

Ok, in deinem Beispiel war die Nummer deutlich kleiner. Wenn die Nummern auch so groß sein können, nehmen wir stattdessen halt long.
# Quellverzeichnis
$Source = "B:\"  

# Alle Nummern der PDF-Dateien auflisten
$Num = Get-ChildItem -File -Recurse "$Source\*.pdf" | Where-Object BaseName -Match "\d+$" | Foreach-Object { [long]$Matches.0 }  

# Minimum/Maximumwerte filtern
$min_max = $Num | Measure -Minimum -Maximum

# fehlende Nummern ausgeben
$min_max.Minimum..$min_max.Maximum | Where-Object { $Num -NotContains $_ }
Member: chgs2011
chgs2011 Mar 14, 2022 at 08:54:23 (UTC)
Goto Top
Vielen Dank für das Update Thomas, habe es mal auf einen Unterordner begrenzt, um zu testen ob sich überhaupt etwas tut.

Das Script "*.ps1" läuft an und schließt dann nach paar Sekunden wieder, ohne jegliche Rückmeldung / Log etc.

Ich wüsste also nicht was nun gemacht wurde, hatte ein PDF mal verschoben, wurde nicht gefunden.

Beispiel:
"Anleitung A278834.pdf"
Member: TK1987
TK1987 Mar 14, 2022 at 10:53:09 (UTC)
Goto Top
Zitat von @chgs2011:
Das Script "*.ps1" läuft an und schließt dann nach paar Sekunden wieder, ohne jegliche Rückmeldung / Log etc.
Erstmal geben die Befehle nur die fehlenden Nummern auf der Konsole aus. Was genau mit den Nummern passieren soll, hast du ja bislang nicht näher spezifiziert.

Um den größtmöglichen Lerneffekt zu erziehlen, empfiehlt es sich für Anfänger immer, die einzelnen Befehle erstmal in der Konsole zu testen.
So kannst du dir erstmal angucken: Welcher Befehl erzeugt welche Ausgabe, wie sehen hinterher meine Variablen aus, usw.

Wenn du das Ganze hinterher als Skript laufen lässt, hast du eben verschiedenste Optionen.

back-to-topDu könntest...
  • das Skript mit Parameter -NoExit starten, damit das Fenster am Ende offen bleibt
  • (wie bei cmd auch) "pause" ans Ende des Skript hinzufügen, damit dieses offen bleibt, bis man die Eingabetaste drückt
  • die Ausgabe in eine Datei schreiben lassen
  • mit der Ausgabe weitere Aktionen durchführen

Um die Ausgabe z. B. in eine Log mitschreiben zu lassen
# fehlende Nummern ausgeben und in Datei schreiben
$min_max.Minimum..$min_max.Maximum | Where-Object { $Num -NotContains $_ } | Tee-Object "C:\Pfad\zur\Logdatei.txt"  

Bitte beachte auch den

Gruß Thomas
Member: chgs2011
chgs2011 Mar 17, 2022 at 17:00:01 (UTC)
Goto Top
Vielen Dank Thomas, ich habe meinen Fehler gefunden!

Es waren leider noch weitere Dokumente mit drin, die natürlich mit betrachtet wurden.

Ich habe daher Zeile 4+5 angepasst und eingegrenzt:
# Alle Nummern der PDF-Dateien auflisten
$Num = Get-ChildItem -File -Recurse "$Source\Anleitung A??????.pdf" | Where-Object BaseName -Match "\d+$" | Foreach-Object { [long]$Matches.0 }