romberto
Goto Top

Per Batch Einträge aus einer Liste in eine neue Liste Verschieben und Textteile in weiteren Listen ausgeben

Hallo,

mit der Überschrift habe mich etwas schwer getan. Ich hoffe ich kann das ganze etwas verständlicher erklären:

Ich möchte als erstes Bezug auf folgenden Thread nehmen:

Per BATCH Dateien in gleichnamigen Ordner verschieben und Ordner anhand Liste umbennen

dort wird der erste Schritt erläutert. Kurz:

Dateien werden mittels Liste in entsprechende Ordner verschoben!

Nun möchte ich, dass gefundene Einträge aus der Liste "Ursprung" in eine neue Liste "Haben" verschoben werden, so dass nur noch Einträge in der Ursprungsliste stehen die nicht gefunden wurden.

Anschließend möchte ich durch einen extra Befehl die Möglichkeit haben aus "Ursprung" und "Haben" gefilterte Informationen auszugeben und zwar in eine "Have" und eine "Missing" Liste.

Genauer:

Die Einträge in der Ursprungsliste sind wie folgt aufgebaut:

Dateiname=Datum - Genaue_Beschreibung

dies soll auch genauso in die Liste "Haben" verschoben werden.

Nun soll jeweils nur "Genaue Beschreibung" also quasi alles nach " - " in den "Have" und "Missing" Listen ausgegeben werden.

Die Batch von Bastla, die den ersten Teil löst habe ich hier:
@echo off & setlocal
> set "Ordner=D:\Ordner mit vielen Dateien"  
> set "Liste=D:\Liste.txt"  
> 
> pushd "%Ordner%"  
> for /f "delims=" %%i in ('dir /b/a-d') do for /f "tokens=1* delims==" %%a in ('findstr /ib  
> "%%i" "%Liste%"') do (  
>     md "%%b" 2>nul && move "%%i" "%%b"  
> )
> popd
> 

Ich hoffe, dass dies irgendwie möglich ist.

Viele Grüße

Robert

Content-Key: 186786

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

Printed on: April 26, 2024 at 22:04 o'clock

Member: Friemler
Friemler Jun 20, 2012 updated at 18:45:09 (UTC)
Goto Top
Hallo Robert,

teste mal die folgenden 2 Scripte.

1. Als Ersatz für obiges Script von bastla, erweitert um das Erzeugen einer Liste der nicht-existierenden Dateien:
@echo off & setlocal

set "Folder=E:\Ordner mit vielen Dateien"  
set "InList=E:\Liste.txt"  
set "ExistList=E:\Liste2.txt"  
set "NotExistList=E:\Liste3.txt"  


type NUL > "%ExistList%"  
type NUL > "%NotExistList%"  
pushd "%Folder%"  

for /f "usebackq tokens=1* delims==" %%a in ("%InList%") do (  
  dir /b /a:-d "%%a" >NUL 2>&1 && (  
    call :FileExists "%%a" "%%b"  
  ) || (
    call :FileNotExists "%%a" "%%b"  
  )
)

echo move "%NotExistList%" "%InList%"  
popd

exit /b



:FileExists
  echo md "%~1" 2>NUL  
  echo move "%~1" "%~2"  
  >>"%ExistList%" echo %~1=%~2  
exit /b 0


:FileNotExists
  >>"%NotExistList%" echo %~1=%~2  
exit /b

Um den Code "scharf" zu schalten, müssen die ECHO-Befehle in den Zeilen 21, 29 und 30 entfernt werden.


2. Um Deine zweite Anforderung zu lösen:
@echo off & setlocal

set "ExistList=E:\Liste2.txt"  
set "HaveList=E:\Have.txt"  
set "NotExistList=E:\Liste.txt"  
set "MissingList=E:\Missing.txt"  


type NUL > "%HaveList%"  
type NUL > "%MissingList%"  

call :ProcessFile "%ExistList%" "%HaveList%"  
call :ProcessFile "%NotExistList%" "%MissingList%"  
exit /b


:ProcessFile
  for /f "usebackq tokens=1* delims==" %%a in ("%~1") do (  
    call :ProcessLine "%%b" "%~2"  
  )
exit /b


:ProcessLine
  set "line=%~1"  
  set "line=%line:* - =%"  
  >>"%~2" echo %line%  
exit /b

Achtung!! Falls die Dateinamen in der Ursprungsliste Umlaute enthalten, muss die Datei in der Codierung OEM850 abgespeichert werden.

Gruß
Friemler
Member: romberto
romberto Jun 20, 2012 updated at 17:07:00 (UTC)
Goto Top
Hallo Friemler,

Vielen Dank schonmal. Ich habe das ganze gerade kurz einmal getestet und leider funktioniert das erste Script nicht wie ich es brauche. Die Dateien in der Liste haben teils sehr komische Dateinamen, da diese noch im 8.3 Format sind. z.B. A&B-CDEF.GHI

Nun bekomme ich die Fehlermeldung, dass z.B. B-CDEFI.GHI nicht gefunden wurde und in Liste.txt steht anschließend nur noch A

Sonst passiert leider nichts

Das Miss und Have Liste Script klappt hervoragend! Vielen Dank

EDIT: Ich habe es soeben nochmals ausführlicher getestet: Ohne Sonderzeichen in den Dateinamen funktioniert es wie es soll (auch mit den Listen) -> ABER: die Dateien werden nicht in gleichnamige Ordner verschoben, sondern einfach umbennant.
Member: Friemler
Friemler Jun 20, 2012 updated at 17:38:45 (UTC)
Goto Top
Hallo Robert,

das Problem mit den Dateinamen, die Sonderzeichen enthalten, liegt am Batchscript-Interpreter. Zeichen wie z.B. & gehören zum Sprachschatz von Batchscript und werden bei den ECHO-Befehlen in den Zeilen 31 und 36 als Operator interpretiert.

Btr. Dateien werden einfach umbenannt: Mein Fehler face-wink

Beides sollte sich erledigen, wenn Du die beiden Unterprogramme FileExists und FileNotExists durch folgenden Code ersetzt:
:FileExists
  echo md "%~2" 2>NUL  
  echo move "%~1" "%~2"  
  >>"%ExistList%" <NUL set /p "=%~1=%~2"  
  >>"%ExistList%" echo.  
exit /b 0


:FileNotExists
  >>"%NotExistList%" <NUL set /p "=%~1=%~2"  
  >>"%NotExistList%" echo.  
exit /b

Dadurch, dass die auszugebenden Strings jetzt in Anführungszeichen eingeschlossen sind, sollte das Problem nicht mehr auftreten.

Btr. die Ausgabeliste: Die Datei, deren Name in der Variablen NotExistList eingetragen ist, wird in Zeile 21 über die ursprüngliche Eingabedatei geschrieben.

Gruß
Friemler
Member: romberto
romberto Jun 20, 2012 at 17:59:27 (UTC)
Goto Top
Hallo Friemler,

Super! Das mit den sonderzeichen stellt nun kein problem mehr dar und Listen kuntionieren auch 1a. Nur leider kopiert er mir die Dateien nicht (entweder garnicht oder es wird angezeigt, dass die Datei bereits von einem anderen Prozess verwendet wird) Mit echo vor den befehlen zeigt er mir zwar an was er machen möchte, ohne echo macht er es aber dann nicht. Ich habe auch schon versucht die Zeile von Bastla einzufügen bzw. anzupassen, da macht er mir aber zusätzlich noch einen Ordner mit Dateinamen.
Member: Friemler
Friemler Jun 20, 2012 at 18:09:14 (UTC)
Goto Top
Hallo Robert,

warum einfach, wenn es auch umständlich geht? face-wink

Das "wird von einem anderen Prozess verwendet" kommt wahrscheinlich von der Art und Weise, wie ich die Existenz der Datei überprüfe. Geht auch einfacher. Ersetze bitte die FOR-Schleife im Hauptprogramm durch folgenden Code:
for /f "usebackq tokens=1* delims==" %%a in ("%InList%") do (  
  if exist "%%a" (  
    call :FileExists "%%a" "%%b"  
  ) else (
    call :FileNotExists "%%a" "%%b"  
  )
)

Gruß
Friemler
Member: romberto
romberto Jun 20, 2012 updated at 18:38:16 (UTC)
Goto Top
Hallo Friemler,

Jetzt geht alles einwandfrei, bis auf eine Kleinigkeit: ist es möglich, dass Liste2.txt fortlaufend zu machen? bis jetzt überschreibt er mir diese bei jedem neuen durchgang neu. achja und wäre es möglich beim 2ten scrip den output alphabetisch zu sortieren?

Ich denke dann bin ich wunschlos glücklich face-smile

Auf jedenfall vielen Dank für deine Mühen.

Viele Grüße

Robert
Member: Friemler
Friemler Jun 20, 2012 at 18:48:10 (UTC)
Goto Top
Hallo Robert,

die Liste2.txt zu sortieren wird schwierig. Um das Überschreiben zu verhindern, könntest Du einfach Zeile 9
type NUL > "%ExistList%"
streichen.

Gruß
Friemler
Member: romberto
romberto Jun 20, 2012 at 19:02:36 (UTC)
Goto Top
SUPER! Vielen, vielen Dank! Bin Wunschlos Glücklich!

Viele Grüße und noch einen schönen Abend

Robert
Member: Friemler
Friemler Jun 20, 2012 at 19:05:45 (UTC)
Goto Top
Hallo Robert,

Du hast Dein Posting editiert!!

Die Ausgabe des zweiten Scripts kann man sehr einfach sortieren. Ersetze das Unterprogramm ProcessFile durch folgenden Code:
:ProcessFile
  for /f "usebackq tokens=1* delims==" %%a in ("%~1") do (  
    call :ProcessLine "%%b" "%~2"  
  )

  sort "%~2" /o "%~2.tmp"  
  move "%~2.tmp" "%~2"  
exit /b

Gruß
Friemler