59384

Script - Batch File zum Abarbeiten von Dateien aus einem TXT-File

Hallo, ich brauche ein Windows Script um folgenden Fall zu lösen:

In einem TXT File ist eine Liste von Dateien die in einem Ordner liegen

1source/
1source/ordner1/
1source/ordner1/hjh.exe
1source/ordner1/osha1.exe

Die Dateien in dieser Liste sollen nun einfach in einen anderen Ordner verschoben werden.

ACHTUNG, es sind aber auch noch x andere Dateien in dem Ordner, es dürfen nur die in der Liste erscheinenden Dateien bearbeitet werden.

Um das ganze noch flexibel auf verschiedenen Rechner zu nutzen sollten die vollständigen Pfade z.b. "N:\daten\xxx\xxx\quelle" zu den Ordnern in eine Variable z.B. "Quelle" und "Archiv" festgelegt werden können.
Klingt eigentlich simpel aber alle Lösungen die ich gefunden habe waren für Linux und ich habe es nicht hinbekommen auf die Windows Shell zu konvertieren.

OS ist Windows 2000

Vielen Dank für Eure Hilfe.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 76984

Url: https://administrator.de/forum/script-batch-file-zum-abarbeiten-von-dateien-aus-einem-txt-file-76984.html

Ausgedruckt am: 28.04.2025 um 21:04 Uhr

bastla
bastla 01.01.2008 um 23:52:07 Uhr
Goto Top
Hallo shakky4711 und willkommen im Forum!

Vorweg zwei Fragen zu der Liste:

1) Wird zur Trennung der Ordnerebenen tatsächlich "/" verwendet, oder enthält die Liste doch "\"?

2) Da offensichtlich nicht nur Dateien, sondern auch die einzelnen Ordner in der Liste enthalten sind: Endet jeder Ordner mit dem Trennzeichen lt Frage 1), sodass also nur nicht mit dem Trennzeichen endende Zeilen zu verschiebende Dateien repräsentieren?

Grüße
bastla
Dani
Dani 02.01.2008 um 00:04:58 Uhr
Goto Top
Abend shakky,
das eigentliche Problem ist, dass in der File auch Verzeichnisnamen an sich drin stehen. Somit würde beim Versuch des Verschiebens der Ordner verschoben bzw. ein Fehler erzeugt. Dies ist aber eine vermeidbare Fehlerquelle!

Ich würde es mal so probieren:
@echo off

rem Variablen
set src_dir=D:\test
set dest_dir= E:\backup
set txt_file=C:\inis\batch.txt

for /f "delims=" %%a in ('type "%txt_file%" ^| findstr /i "[^\\]$"') do move /y "%src_dir%\%%a" "%dest_dir%"  
Somit wird jede Datei in das Verzeichnis "e:\backup" verschoben, egal aus welchem Quellverzeichnis diese kommt. Mit dem Schalter "/y" bei "move" wird das Überscheiben automatisch mit "Yes" beantwortet.
Durch den reg. Ausdruck im findstr Befehl wird sichergestellt, dass wirklich nur Dateien ausgeben werden. Dadurch das die Verzeichnisse alle mit "\" enden, habe ich den Filter darauf eingestellt.

@bastla
Sry, warst wohl schneller. Aber deine Fragen sind berechtigt! Ich habe das als Backslash gesehen. Der reg. Ausdruck hat mich aufgehalten. Sowas braucht man schließlich nicht jeden Tag. face-wink


Grüße
Dani

P.S. Unter Windows werden die Verzeichnisse mit "\" (Backslash) angeben - Linux: Slash.
bastla
bastla 02.01.2008 um 00:43:45 Uhr
Goto Top
@Dani

... dafür hast Du die elegantere Lösung ...

Der Schalter "/y" für den "move"-Befehl ist allerdings bei Verwendung in einem Batch unnötig - es wird auch ohne überschrieben.
@59384

Noch eine Frage: Soll die Ordnerstruktur beibehalten werden (Pfad der Datei daher nach dem Verschieben zB "D:\Test\Archiv\1source\ordner1\hjh.exe")?

Falls ja, sollte es (unter zusätzlicher Vorwegnahme Deiner Antworten auf die ersten beiden Fragen mit 1) "\" und 2) "ja") etwa so gehen:
@echo off & setlocal
set "Source=N:\daten\xxx\xxx\quelle"  
set "Archiv=D:\Test\Archiv"  
set "List=D:\Liste.txt"  

for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "S=%Source%\%~1"  
if %S:~-1%==\ goto :eof
set "T=%Archiv%\%~p1"  
if not exist "%T%" md "%T%"  
move "%S%" "%T%"  

Grüße
bastla
59384
59384 03.01.2008 um 22:09:21 Uhr
Goto Top
SUPER, beide Scripte laufen prima, auch mit Leerzeichen in den Dateinamen...

Zu den Fragen, in der Liste sind die Pfade wirklich mit einem "/". Die Liste wird durch rsync unter Cygwin mittels Schalter --dry-run generiert, anschließend mit unxutils in die notwendige Form zurechtgestutzt.

Die einzigste Modifikation die ich jetzt noch machen musste waren die "/" durch "\" im Text File zu ersetzen.

Nochmals vielen vielen Dank, hab mir schon endlose Stunden um die Ohren geschlagen.

Gruß
Shakky4711
Biber
Biber 04.01.2008 um 00:01:53 Uhr
Goto Top
Moin Shakky4711,

Du kannst natürlich auch die "/" in der Textdatei stehenlassen und in bastlas Schnipsel noch eine Zeile mehr einfügen:
....
for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "S=%Source%\%~1"  
:: jetzt die neue Zeile (==ersetze alle "/" in %S% durch "\") 
set S=%S:/=\%
....

Da das aber nur Kosmetik ist: ich würde gern auch den Thread schließen.
Aber erst nachdem Du ihn als "gelöst" markiert hast.

Grüße
Biber
59384
59384 04.01.2008 um 21:27:28 Uhr
Goto Top
Nochmals vielen Dank an Euch alle!