andichrist
Goto Top

Nummerierte Dateien auf Lückenlosigkeit überprüfen. Fehler in Datei ausgeben!

Hallo,

ich habe sehr viele Dateien in einem Ordner auf Vollständigkeit zu überprüfen. Eventuell auftreten Lücken (fehlende Datein) mußten bisher mit erhöhtem Zeitaufwand aufgespürt werden.

Um mir die Arbeit zukünftig zu erleichtern, wäre es hilfreich eine Batch zu haben, die den Ordner durcharbeitet und jede "Lücke" (fehlende Nummer) in eine Datei zB. Fehler.log ausgibt!


Beispiel:

c:\Temp

3401.txt <- START (hier im Beispiel)
3402.txt
3403.txt
3404.txt
3406.txt
3407.txt
3634.txt
3635.txt
3640.txt
3641.txt
...
3997.txt
3998.txt
3999.txt
4000.txt <- ENDE (hier im Beispiel)

Hier sollte in der Fehler.log folgende Dateien als fehlende Dateien aufgelistet werden:

3405.txt
3636.txt
3637.txt
3638.txt
3639.txt


Anmerkung: START (hier 3401) und ENDE (4000) sind eindeutig und können für eine Schleife (von 3401 bis 4000) benutzt werden! START und ENDE variieren!

Zwei Szenarios sind möglich!

1) nur durchnummerierte Dateien -> 1234.txt
2) Nummer+Dateinamen 1234 Objekt Kala.txt

Es wäre schön, wenn jemand eine Lösung parat hätte!

Vielen Dank im Voraus
AndyChrist

Content-ID: 127872

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

Ausgedruckt am: 26.11.2024 um 11:11 Uhr

bastla
bastla 25.10.2009 um 16:53:41 Uhr
Goto Top
Hallo Andy!

Falls ich das richtig verstehe (es ist nur der Anfang des Dateinamens zu prüfen, da im Anschluss an die laufende Nummer zusätzlicher Text folgen kann), könnte das etwa so aussehen (ist allerdings ungetestet):
@echo off & setlocal
set "Ordner=C:\Temp"  
set "Typ=txt"  
set /a Von=3401
set /a Bis=4000
set "Log=D:\Fehler.log"  

set "DirList=%temp%\DirList.txt"  
>"%DirList%" dir /b "%Ordner%\*.%Typ%"  
if exist "%Log%" del "%Log%"  
for /L %%i in (%Von%,1,%Bis%) do findstr /b "%%i" "%DirList%"||>>"%Log%" echo %%i.txt  
del "%DirList%"  
Grüße
bastla
Andichrist
Andichrist 25.10.2009 um 18:40:59 Uhr
Goto Top
Hallo bastla,

prima die Batch ' Suche.bat' macht genau das, was sie machen soll! *TOP*

Jetzt hätte ich nur noch einen Vereinfachungswunsch beim Batchaufruf! ^^

Könnte man die Batch noch soweit anpassen, dass noch der Suchbereich als Parameter (VON -> BIS) beim Aufruf direkt mitgegeben werden könnte.

Also: suche 3401 4000

So müßte man die Batch nicht permanent wegen des Suchbereiches anpassen!

Gruß
Andy
bastla
bastla 25.10.2009 um 18:53:06 Uhr
Goto Top
Hallo Andy!

Dazu brauchst Du ja nur die Zeilen 4 und 5 leicht zu ändern:
set /a Von=%1
set /a Bis=%2
Zur Sicherheit kann natürlich vorweg noch geprüft werden, ob zumindest 2 Parameter angegeben wurden:
if [%2]== echo Verwendung: %~nx0 Von Bis & echo\ & pause & goto :eof
Grüße
bastla
Andichrist
Andichrist 25.10.2009 um 23:47:18 Uhr
Goto Top
Hallo bastla,

ich danke Dir für Deine Lösung! Funktioniert 100%!

Ich mußte aber feststellen, das ein Batch-Aufruf per KLICK komfortabler ist! face-wink

Daher habe ich die VON/ BIS Abfrage in die Batch eingebaut!

Für die Leute die diese Lösung bevorzugen, einfach Zeile 4 und 5 (siehe Script von bastla) ersetzen!

echo Bitte START-Wert (VON) angeben:
set /p Von=%1 

echo Bitte END-Wert (BIS) angeben:
set /p Bis=%2


Viele Grüße
Andy
bastla
bastla 25.10.2009 um 23:55:59 Uhr
Goto Top
Hallo Andy!

Eigentlich genügte auch:
set /p Von=Bitte START-Wert (VON) angeben: 
set /p Bis=Bitte END-Wert (BIS) angeben: 
Grüße
bastla
Andichrist
Andichrist 26.10.2009 um 00:03:54 Uhr
Goto Top
'Alla gut' - überzeugt! *grins*

Du bist der Experte! face-smile

Sieht besser aus als mein gebasteltes.

Gruß
Andy
Spencer099
Spencer099 01.12.2010 um 00:12:28 Uhr
Goto Top
Hallo Bastla,

ich habe ein ähnliches Problem!
Vielleicht kannst du mir auch dabei helfen.
Ich muss in einem Verzeichniss überprüfen ob die Dateien fortlaufen sind oder doppelt sind!
Dateinamen sind wie folgt aufgebaut:
XXX00001_Beschreibung.pdf
XXX =Fixer Bestandteil 3 Stellig z.B. SCN
00001=fortlaufende Numerierung 5 Stellig
_=Trennzeichen
Beschreibung=Varibler Zusatztext z.B Privat oder Bild etc.

Im Verzeichniss liegen z.B. die folgenden Dateien:
SCN00001_Privat.pdf
SCN00002_Bild.pdf
SCN00003_Privat-Informationen.pdf
.
.
.SCN00622_Privat-.pdf

Es soll also nur geprüft werden ob die ersten 8 Zeichen im Dateinamen doppelt sind und fortlaufend.
Eine Ausgabe der Fehlerdatei über eine Log Datei reicht mir komplett aus.
Hast du dafür eine Idee

Vielen Dank Martin
bastla
bastla 01.12.2010 um 19:51:50 Uhr
Goto Top
Hallo Spencer099!

Könnte etwa so gehen:
@echo off & setlocal
set "Ordner=D:\Viele Dateien"  
set "Maske=*_*.pdf"  
set "Fix=SCN"  
set "Log=D:\Fehler.log"  

set "DirList=%temp%\DirList.txt"  
type nul>"%DirList%"  
del "%Log%" 2>nul  
set /a Nr=100000
set "Fehlende="  
for %%i in ("%Ordner%\%Maske%") do call :ProcessFile "%%~nxi"  
if defined Fehlende (
    echo\
    echo Nummern nicht fortlaufend - erste Fehlende: %Fehlende%
)>>"%Log%"  
del "%DirList%" 2>nul  
goto :eof

:ProcessFile
for /f "delims=_" %%a in (%1) do set "Kennz=%%a"  
set /a Nr+=1
if "%Kennz%" neq "%Fix%%Nr:~-5%" if not defined Fehlende set "Fehlende=%Fix%%Nr:~-5%"  
findstr "%Kennz%" "%DirList%">nul && >>"%Log%" echo Doppelt: %~1 || >>"%DirList%" echo %Kennz%  
goto :eof
Grüße
bastla
Spencer099
Spencer099 01.12.2010 um 21:05:51 Uhr
Goto Top
Hallo Bastla,

erste einmal vielen Dank für die schnelle Antwort.
Leider geht es nicht er schreibt mit in der Fehler.log folgendes hinein:


Nummern nicht fortlaufend - erste Fehlende: SCN00001

Hast du da noch eine Idee?

Grüße Spencer099
bastla
bastla 01.12.2010 um 21:17:04 Uhr
Goto Top
Hallo Spencer099!

Wenn die Daten in den Zeilen 2 bis 4 an Deine Gegebenheiten angepasst sind, kann ich mir das Ergebnis nicht erklären - um aber zumindest die Eventualität Groß-/Kleinschreibung hinsichtlich des "fixen" Teil "SCN" zu berücksichtigen, verwende bitte folgende Zeile 23:
if /i "%Kennz%" neq "%Fix%%Nr:~-5%" if not defined Fehlende set "Fehlende=%Fix%%Nr:~-5%"
[Edit]
bzw verwende besser diese Version:
if "%Kennz:~3,5%" neq "%Nr:~-5%" if not defined Fehlende set "Fehlende=%Nr:~-5%"
- damit wird tatsächlich nur noch die Nummer geprüft.

Um dies auch für die Dubletten so umzusetzen, könntest Du gleich den gesamten letzten Teil austauschen:
:ProcessFile
for /f "delims=_" %%a in (%1) do set "Kennz=%%a"  
set "Kennz=%Kennz:~3,5%"  
set /a Nr+=1
if "%Kennz%" neq "%Nr:~-5%" if not defined Fehlende set "Fehlende=%Nr:~-5%"  
findstr "%Kennz%" "%DirList%">nul && >>"%Log%" echo Doppelt: %~1 || >>"%DirList%" echo %Kennz%  
goto :eof
[/Edit]

Um den Ablauf besser nachvollziehen zu können, wäre es auch sinnvoll, aus dem "echo off" in Zeile 1 (vorübergehend) ein "echo on" zu machen und den Batch aus der CMD-Shell zu starten bzw zumindest unmittelbar vor Zeile 18 eine Zeile
pause
einzufügen.

Grüße
bastla
chgs2011
chgs2011 02.03.2022 um 09:56:25 Uhr
Goto Top
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, 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, Hauptsache wir finden evtl. fehlende Nummern.

Datei heißt 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
...