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:
Ich hoffe, dass dies irgendwie möglich ist.
Viele Grüße
Robert
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 186786
Url: https://administrator.de/forum/per-batch-eintraege-aus-einer-liste-in-eine-neue-liste-verschieben-und-textteile-in-weiteren-listen-ausgeben-186786.html
Ausgedruckt am: 11.01.2025 um 03:01 Uhr
9 Kommentare
Neuester Kommentar
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:
Um den Code "scharf" zu schalten, müssen die
2. Um Deine zweite Anforderung zu lösen:
Achtung!! Falls die Dateinamen in der Ursprungsliste Umlaute enthalten, muss die Datei in der Codierung OEM850 abgespeichert werden.
Gruß
Friemler
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
Hallo Robert,
das Problem mit den Dateinamen, die Sonderzeichen enthalten, liegt am Batchscript-Interpreter. Zeichen wie z.B.
Btr. Dateien werden einfach umbenannt: Mein Fehler
Beides sollte sich erledigen, wenn Du die beiden Unterprogramme
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
Gruß
Friemler
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
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
Hallo Robert,
warum einfach, wenn es auch umständlich geht?
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
Gruß
Friemler
warum einfach, wenn es auch umständlich geht?
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
Hallo Robert,
Du hast Dein Posting editiert!!
Die Ausgabe des zweiten Scripts kann man sehr einfach sortieren. Ersetze das Unterprogramm
Gruß
Friemler
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