
59384
01.01.2008, aktualisiert am 04.01.2008
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
6 Kommentare
Neuester Kommentar
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
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
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:
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.
Grüße
Dani
P.S. Unter Windows werden die Verzeichnisse mit "\" (Backslash) angeben - Linux: Slash.
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%"
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.
Grüße
Dani
P.S. Unter Windows werden die Verzeichnisse mit "\" (Backslash) angeben - Linux: Slash.
@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:
Grüße
bastla
... 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
Moin Shakky4711,
Du kannst natürlich auch die "/" in der Textdatei stehenlassen und in bastlas Schnipsel noch eine Zeile mehr einfügen:
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
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