romberto
Goto Top

Per Batch Ordner nach Dateien anhand einer Liste durchsuchen und Ergebnisse in einer Textdatei ausgeben

Aloha,

nachdem sich in meinem Arbeitsprozess wohl 1-2 Fehler eingeschlichen haben, benötige ich eine Batch als Kontrolle:

Ich habe mittels einer anderen Batch, Dateien anhand einer Liste in einzelne Ordner verschoben. Nun möchte ich überprüfen ob das auch einwandfrei geklappt hat und was ich noch zu tun habe.

Die Liste ist wiefolgt aufgebaut:

Dateiname=Datum - Beschreibung

Beispiel: m&v!tglo.pdf=2012-06-25 - Beispiel_Projekt-Mustermann&Vogler

Die Datei "m&v!tglo.pdf" wurde also in den Ordner "2012-06-25 - Beispiel_Projekt-Mustermann&Vogler" verschoben.

Die Ordner befinden sich alle in einem Hauptverzeichnis, welches nun anhand der Liste durchsucht werden soll. Und zwar ob die richtigen Datein im richtigen Ordner sind. Was übereinstimmt soll in einer Liste ausgegeben werden, was nicht übereinstimmt bzw. Fehlerhaft einsortiert wurde in einer 2ten und was gänzlich fehlt in einer 3ten. Hierbei ist die Schwierigkeit, dass es sein kann, dass in diesem Hauptverzeichnis, einzelne Dateien liegen die zwar in der Liste vorkommen aber (noch) nicht im entsprechenden Ordner liegen. Diese sollen wenn möglich ignoriert werden. Zudem können noch weitere Ordner vorhanden sein, die mit dem Pozess ebenfalls nichts zu tun haben - auch diese sollen ignoriert werden. Im schlimmsten Fall sind Dateien die in der Liste vorhanden sind in Ordnern sie nicht in der Liste sind. Auch diese sollen ignoriert werden

Es sollen also quasi nur die Ordner durchsucht werden, welche auch in der Liste aufgeführt werden.

In den jeweiligen Ausgabe Listen soll nur jeweils die Beschreibung ohne Datum aufgeführt werden also: Beispiel_Projekt-Mustermann&Vogler. Die "Fehlt noch" Liste soll zusätzlich im "Original Format" unter anderm Namen abgespeichert werden also inkl: Dateiname=Datum - Beschreibung. Quasi als 4te Liste.

Es kann vorkommen, dass anhand der Liste mehrere Dateien einem Ordner zugewiesen sind. Wenn nun z.b. 5 Dateien dem Ordner zugewiesen sind aber nur 1 (oder 2,3,4) Vorhanden ist (sind) soll dieser Ordner trotzdem auf der Habenseite verbucht werden allerdings mit dem Zusatz was genau fehlt. Z.B.: Beispiel_Projekt-Mustermann&Vogler -> ES FEHLEN: m&v!tglo1.pdf, blabla2.xml

Die Liste mit den Fehlerhaften Eintägen soll den Beschreibungs Ordner auführen mit dem Zusatz was falsch einortiert wurde. Z.B. Beispiel_Projekt-Mustermann&Vogler -> FALSCH: lp-&tz.zip

Puh... ein ganz schöner Batzen, ich hoffe einer von euch steigt da irgendwie durch.

Hier nochmal die Kurzbeschreibung:
1) Ordner nach Dateien Anhand Liste durchsuchen
2) Übereinstimmung in Liste (nur Beschreibungs Ordner ohne Datum + evtl. Zusatz bei mehreren Dateien)
3) Fehlende in 2te Liste (nur Beschreibungs Ordner ohne Datum)
4) Fehlende ebenso als Ursprünglichen Aufbau speichern
4) Fehlerhaft in 4te Liste (nur Beschreibungs Ordner ohne Datum + was Falsch ist)

Viele Grüße

Robert

Content-Key: 186972

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

Printed on: April 25, 2024 at 14:04 o'clock

Member: Turrex0100
Turrex0100 Jun 25, 2012 updated at 12:51:38 (UTC)
Goto Top
Hallo Robert,

Mein ungetesteter Ansatz für deine ersten Punkte wäre diser:

@echo off
set "checkliste=C:\test\test.bat"  
set "checkfolder=C:\test"  
cd %checkfolder%
for /f "tokens=1,2 delims==" %%a in (%checkliste%) do (call :prozess "%%a" "%%b")  
goto :eof

:prozess
set "file=%~1"  
set "folder=%~2"  
for /f "tokens=2 delims=-" %%c in ("%folder%") do set beschreibung=%%c   
cd %folder%
if exist %file% (echo %beschreibung%>>istdrin.txt) else (echo %beschreibung%>>istNICHTdrin.txt)
cd..
goto :eof

Die zweiter for-Schleife liefert die beschreibung ohne Datum. Ich hoffe dass hilft dir schon mal, wenn ich später noch zeit finde sehe ich mir den rest mal an...

Gruß Malte.
Member: pieh-ejdsch
pieh-ejdsch Jun 25, 2012 updated at 14:09:56 (UTC)
Goto Top
moin Robert,

ungetestet!! würde ich das ganze so machen:
@echo off
setlocal

set           "Ordner=D:\  
set     "EingabeListe=D:\DatenVerschieben.txt"  
set   "InOrdnungListe=D:\Das wurde richtig sortiert.txt"  
set   "NichtVorhanden=D:\Fehlt noch Liste.txt"  
set "NichtVorhandenOF=D:\Noch mal zu erledigen Liste.txt"  
set "NichtVorhandenBF=D:\Das ist Falsch geworden Liste.txt"  

set T="%temp%\Listetmp"  

 rem Falls ... Listen Leeren
::for %%i in ("%InOrdnungListe%" "%NichtVorhanden%" "%NichtVorhandenOF%" "%NichtVorhandenBF%" ) do type nul >"%%~i"  

 rem EingabeListe sortieren und Umschreiben (Pfad?Dateiname?Beschreibung)
( @for /f "usebackqtokens=1-4*delims==- " %%i in ("%EingabeListe%") do @echo %%j-%%k-%%l - %%m?%%i?%%m  
) |sort  >%T%

(
for /f "usebackqtokens=1-3delims=?" %%i in (%T%) do (  
  if exist "%%i\%%j" >&3 echo %%j  
  if not exist "%%i\%%j" for /r "%Ordner%" %%a in ("%%j") do (  
    >&4 echo %%k
    >&5 echo %%j=%%i
    if "%%~dpa" equ "%Ordner%" findstr /x "%%j" "%InOrdnungListe%" 1>nul 2>nul && >&3 echo %%j  -- Noch nicht Verschoben...  
    if "%%~dpa" equ "%Ordner%" >&6 echo %%k -- Noch nicht Verschoben... %%j  
    if "%%~dpa" neq "%Ordner%" findstr /x "%%j" "%InOrdnungListe%" 1>nul 2>nul && >&3 echo %%j  -- im Falschen Ordner: %%a  
    if "%%~dpa" neq "%Ordner%" >&6 echo %%k -- %%j im Falschen Ordner: %%a  
) )
) 3>>"%InOrdnungListe%" 4>>"%NichtVorhanden%" 5>>"%NichtVorhandenOF" 6>>"%NichtVorhandenBF%"  


Gruß Phil
Member: romberto
romberto Jun 25, 2012 updated at 14:44:35 (UTC)
Goto Top
Hallo Malte, Hallo Phil,

Vielen Dank schonmal an euch beide! Leider scheint keine der beiden Lösungsvorschläge zu funktionieren.

@Malte: Hier bekam ich erstmal nur 2 Zahlen in die Listen geschrieben... Zeile 11 habe ich dann wie folgt geändert:

for /f "tokens=3 delims= " %%c in ("%folder%") do set beschreibung=%%c  

(es sind auch diverse "-" in den Dateinamen vorhanden)

Danach hat er mir ausschließlich den istNICHTdrin.txt text ausgegeben und das auch unvollständig.

@phil: Deine Batch schein in einer Endlosschleife zu laufen. Ich habe nach 5 Minuten abgebrochen -> "InOrdnungListe" war leer und in "NichtVorhanden" wurde jeder Eintrag 250 mal geschrieben...
Member: pieh-ejdsch
pieh-ejdsch Jun 25, 2012 updated at 18:01:59 (UTC)
Goto Top
hallo Robert,

deswegen ist der ja ungetestet (immer mit eingebauten Fehlerchen zum Lernen und Nachvollziehen ... face-wink.
Aber in einer Endlosschleife lief der Batch nicht.

hier ist die gehybschte Version davon:
@echo off
setlocal
mode 220

 rem Ordner mit anschliesenden Backslash angeben
set           "Ordner=J:\Neuer\"  
set     "EingabeListe=J:\Neuer\DatenVerschieben.txt"  
set   "InOrdnungListe=J:\Neuer\Das wurde richtig sortiert.txt"  
set   "NichtVorhanden=J:\Neuer\Fehlt noch Liste.txt"  
set "NichtVorhandenOF=J:\Neuer\Noch mal zu erledigen Liste.txt"  
set "NichtVorhandenBF=J:\Neuer\Das ist Falsch geworden Liste.txt"  

set T="%temp%\Listetmp"  

 rem Falls ... Listen Leeren
for %%i in ("%InOrdnungListe%" "%NichtVorhanden%" "%NichtVorhandenOF%" "%NichtVorhandenBF%" ) do type nul >"%%~i"  

 rem EingabeListe sortieren und Umschreiben  ( Beschreibung?Pfad?Dateiname? )
( @for /f "usebackqtokens=1-4*delims==- " %%i in ("%EingabeListe%") do @echo %%m?%%j-%%k-%%l - %%m?%%i?  
) |sort  >%T%

(
for /f "usebackqtokens=1-3delims=?" %%i in (%T%) do (  
  echo Ueberpruefe: %%i^> %%j\%%k
  set "NoFile="  
  if exist "%Ordner%%%j\%%k" set "NoFile=1" & >&3 echo %%i -- %%j\%%k  
  if not exist "%Ordner%%%j\%%k" for /r "%Ordner%" %%a in ("%%k?") do (  
    set "NoFile=1"  
    >&4 echo %%i -- %%j\%%k
    >&5 echo %%k=%%j
    if "%%~dpa" equ "%Ordner%" findstr /x "%%j" "%InOrdnungListe%" 1>nul 2>nul && >&3 echo %%i -- Noch nicht Verschoben: %%j\%%k  
    if "%%~dpa" equ "%Ordner%" >&6 echo %%i -- Noch nicht Verschoben: %%j\%%k  
    if "%%~dpa" neq "%Ordner%" findstr /x "%%j" "%InOrdnungListe%" 1>nul 2>nul && >&3  echo %%i -- im Falschen Ordner: %%a -- muss nach: %%j\%%k  
    if "%%~dpa" neq "%Ordner%" >&6 echo %%i -- im Falschen Ordner: %%a -- muss nach: %%j\%%k  
  )
  if not defined NoFile >&5 echo %%k=%%j& >&6 echo %%i -- Hinweis Datei nicht Vorhanden: %%k 
)
) 3>>"%InOrdnungListe%" 4>>"%NichtVorhanden%" 5>>"%NichtVorhandenOF%" 6>>"%NichtVorhandenBF%"  

ping localhost -n 10 1>nul

Gruß Phil
Member: romberto
romberto Jun 25, 2012 at 18:21:58 (UTC)
Goto Top
Hallo Phil,

Vielen Dank! Jetzt werden alle Dateien erstellt -> ABER: Es gibt noch ein Paar Problemchen:

1) 1 Kleiner Verwechslungsfehler hat sich eingeschlichen, bei dem ich mich aber auch evtl. falsch ausgedrückt habe -> in "NichtVorhanden" und "NichtVorhandenOF" sollen ausschließlich die Einträge rein die momentan in "NichtVorhandenBF" mit dem Hinweis Datei nicht Vorhanden: ausgegeben werden (also die Dateien die nicht gefunden wurden)

"im Falschen Ordner:" "Noch nicht Verschoben:" (also die Fehler) sollen dafür in "NichtVorhandenBF" ausgegeben werden.

2)Dateien mit einem "-" im Namen werden nicht erkannt (beispiel m&v-1234.pdf) bzw. verursachen Fehler.

Dies wird mir mir dem Zusatz "Hinweis Datei nicht Vorhanden: m&v"

ausgegeben.

3) Einige Verzeichnisse werden nicht richtig getrennt, gerade wenn ein "-" im dateinamen ist:

m&v-1234.pdf=2012-06-25 - Beispiel-Mustermann&Vogel

wird zu -> 25 - Beispiel-Mustermann&Vogel -- Hinweis Datei nicht Vorhanden: m&v

Ich denke dafür sind nur minimale abänderungen nötig, denn vom Prinzip her geht das Teil ja 1A...
Ich kenne mich leider erst sehr wenig mit Batch Programmierungen aus um hier die Fehler zu Orten - Bin dir aber wirklich sehr Dankbar, dass du dieses Monstrum geschrieben hast ;)

Viele Grüße

Robert
Member: pieh-ejdsch
pieh-ejdsch Jun 25, 2012 at 18:54:27 (UTC)
Goto Top
mit Trennung "=" für Dateiname und Trennung " - " für die Beschreibung
und die Änderungen also in etwa so:
@echo off
setlocal
mode 220

set           "Ordner=J:\Neuer\"  
set     "EingabeListe=J:\Neuer\DatenVerschieben.txt"  
set   "InOrdnungListe=J:\Neuer\Das wurde richtig sortiert.txt"  
set   "NichtVorhanden=J:\Neuer\Fehlt noch Liste.txt"  
set "NichtVorhandenOF=J:\Neuer\Noch mal zu erledigen Liste.txt"  
set "NichtVorhandenBF=J:\Neuer\Das ist Falsch geworden Liste.txt"  

set T="%temp%\Listetmp"  

 rem Falls ... Listen Leeren
for %%i in ("%InOrdnungListe%" "%NichtVorhanden%" "%NichtVorhandenOF%" "%NichtVorhandenBF%" ) do type nul >"%%~i"  

 rem EingabeListe sortieren und Umschreiben  ( Beschreibung?Pfad?Dateiname? )
( @for /f "usebackqtokens=1*delims==" %%i in ("%EingabeListe%") do @(  
  for /f "tokens=1-3* delims=- " %%j in ("%%j") do @echo %%m?%%j-%%k-%%l - %%m?%%i?  
)) |sort  >%T%

(
for /f "usebackqtokens=1-3delims=?" %%i in (%T%) do (  
   rem Meldung im Fenster ausgeben
  echo Ueberpruefe: %%i^> %%j\%%k
  set "NoFile="  
   rem Meldung nach Handle 3 umbiegen 
  if exist "%Ordner%%%j\%%k" set "NoFile=1" & >&3 echo %%i -- %%j\%%k  
  if not exist "%Ordner%%%j\%%k" for /r "%Ordner%" %%a in ("%%k?") do (  
    set "NoFile=1"  
    if "%%~dpa" equ "%Ordner%" findstr /c:"- %%j\\" "%InOrdnungListe%" 1>nul 2>nul && >&3 echo %%i -- Noch nicht Verschoben: %%j\%%k  
     rem Meldung nach Handle 6 umbiegen
    if "%%~dpa" equ "%Ordner%" >&6 echo %%i -- Noch nicht Verschoben: %%j\%%k  
    if "%%~dpa" neq "%Ordner%" findstr /c:"- %%j\\" "%InOrdnungListe%" 1>nul 2>nul && >&3  echo %%i -- im Falschen Ordner: %%a -- muss nach: %%j\%%k  
    if "%%~dpa" neq "%Ordner%" >&6 echo %%i -- im Falschen Ordner: %%a -- muss nach: %%j\%%k  
  )
   rem Meldung nach Handle 5 und naechste nach Handle 4 umbiegen
  if not defined NoFile >&5 echo %%k=%%j& >&4 echo %%i -- Hinweis Datei nicht Vorhanden: %%k 
)
 rem Die Meldungen der Umgebogenen Handles 3 - 6 an die Dateien anhängen
) 3>>"%InOrdnungListe%" 4>>"%NichtVorhanden%" 5>>"%NichtVorhandenOF%" 6>>"%NichtVorhandenBF%"  

pause

PS. Das ist doch kein Monstrum
Gruß Phil
Member: romberto
romberto Jun 25, 2012 at 19:34:30 (UTC)
Goto Top
Hallo Phil,

für jemanden der sonst nur mit maximal 8 Zeilen arbeitet ist das schon ne Hausnummer.

Vielen, vielen Dank! Habe gerade alle Eventualitäten getestet die mir eingefallen sind und alles hat einwandfrei funktioniert. Und das sogor um einiges besser als ich es mir überlegt hatte.

Nochmals Danke und noch einen schönen Abend.

Viele Grüße

Robert