59384
Goto Top

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.

Content-Key: 76984

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

Printed on: April 23, 2024 at 23:04 o'clock

Member: bastla
bastla Jan 01, 2008 at 22:52:07 (UTC)
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
Member: Dani
Dani Jan 01, 2008 at 23:04:58 (UTC)
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.
Member: bastla
bastla Jan 01, 2008 at 23:43:45 (UTC)
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
Mitglied: 59384
59384 Jan 03, 2008 at 21:09:21 (UTC)
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
Member: Biber
Biber Jan 03, 2008 at 23:01:53 (UTC)
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
Mitglied: 59384
59384 Jan 04, 2008 at 20:27:28 (UTC)
Goto Top
Nochmals vielen Dank an Euch alle!