Batchprogramm unter WinXP
Hallo allerseits,
ich habe folgendes Problem: ich will Dateien, die in einem Quell-Ordner liegen per Batch in mehrere andere Ziel-Ordner kopieren. Die Zielordner sind Unterordner und entsprechen in den ersten 4 Stellen den ersten 4 Stellen der zu kopierenden Dateien. Bestehende, gleichnamige Dateien im Zielordner sollen überschrieben werden. Es soll ein kurzes Protokoll erstellt werden, damit klar ist, ob alle Quelldateien in den Zielordnern angekommen sind.
Bsp.:
Quellpfad ist c:\temp
Dateien darin lauten:
1000_a.pdf
1000_b.pdf
1000_a.png
1000_b.png
1010_a.png
2000_a.pdf
2000_a.png
Zielpfad ist d:\test
Die Unterordner dazu heissen (sie existieren schon):
d:\test\1000_x\
d:\test\1010_z\
d:\test\2000_y\
Am Ende sollte es so aussehen:
d:\test\1000_x enthält 1000_a.pdf, 1000_b.pdf, 1000_a.png, 1000_b.png
d:\test\1010_z\ enthält 1010_a.png
d:\test\2000_y enthält 2000_a.pdf, 2000_a.png
Das Ganze soll als Batchdatei unter Windows laufen.
Ich habe mit folgendem Batch leider nur einen Teilerfolg erreicht, da das Programm immer neue Pfade anlegt und nicht die bestehenden benutzt:
for %a in (c:\temp\*.*) do @for /f "delims=_ tokens=1" %i in ("%~nxa") do xcopy /I /Y %a c:\temp\%i\
Ein weiterer Versuch scheiterte auch, da ich das CD-Kommando nicht mit einem vernünftigen Wert versorgen kann:
for %%a in (c:\temp\*.*) do @for /f "delims=_ tokens=1" %%i in ("%%~nxa") do call :loop
:loop
cd %%i*
xcopy /I /Y c:\temp\%%a
cd ..
Kann mir jemand helfen???
Vielen Dank und viele Grüsse,
MAPL
ich habe folgendes Problem: ich will Dateien, die in einem Quell-Ordner liegen per Batch in mehrere andere Ziel-Ordner kopieren. Die Zielordner sind Unterordner und entsprechen in den ersten 4 Stellen den ersten 4 Stellen der zu kopierenden Dateien. Bestehende, gleichnamige Dateien im Zielordner sollen überschrieben werden. Es soll ein kurzes Protokoll erstellt werden, damit klar ist, ob alle Quelldateien in den Zielordnern angekommen sind.
Bsp.:
Quellpfad ist c:\temp
Dateien darin lauten:
1000_a.pdf
1000_b.pdf
1000_a.png
1000_b.png
1010_a.png
2000_a.pdf
2000_a.png
Zielpfad ist d:\test
Die Unterordner dazu heissen (sie existieren schon):
d:\test\1000_x\
d:\test\1010_z\
d:\test\2000_y\
Am Ende sollte es so aussehen:
d:\test\1000_x enthält 1000_a.pdf, 1000_b.pdf, 1000_a.png, 1000_b.png
d:\test\1010_z\ enthält 1010_a.png
d:\test\2000_y enthält 2000_a.pdf, 2000_a.png
Das Ganze soll als Batchdatei unter Windows laufen.
Ich habe mit folgendem Batch leider nur einen Teilerfolg erreicht, da das Programm immer neue Pfade anlegt und nicht die bestehenden benutzt:
for %a in (c:\temp\*.*) do @for /f "delims=_ tokens=1" %i in ("%~nxa") do xcopy /I /Y %a c:\temp\%i\
Ein weiterer Versuch scheiterte auch, da ich das CD-Kommando nicht mit einem vernünftigen Wert versorgen kann:
for %%a in (c:\temp\*.*) do @for /f "delims=_ tokens=1" %%i in ("%%~nxa") do call :loop
:loop
cd %%i*
xcopy /I /Y c:\temp\%%a
cd ..
Kann mir jemand helfen???
Vielen Dank und viele Grüsse,
MAPL
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 154091
Url: https://administrator.de/forum/batchprogramm-unter-winxp-154091.html
Ausgedruckt am: 17.04.2025 um 21:04 Uhr
8 Kommentare
Neuester Kommentar
Hallo mapl99sb und willkommen im Forum!
Das könnte etwa so gehen:
[Edit] Fehlendes Anführungszeichen am Ende der Zeile 29 ergänzt [/Edit]
Mit einer alternativen Schreibweise der Protokolleinträge ließe sich das noch kompakter formulieren:
Nur als Anmerkung: Protokolliert wird in beiden Fällen nicht der Kopiervorgang, sondern der Ordnerinhalt nach dem Kopieren (es war ja "angekommen" gefragt) ...
Zum jeweiligen Zielordner wäre noch zu erwähnen, dass in den ersten Ordner, dessen Name mit "<Teil 1 Dateiname>_" (also: Zeichenkette des Dateinamens bis zum ersten "_" + "_") entspricht, kopiert wird (auch wenn nach dem "_" nix oder mehr als ein Zeichen folgt - daher auch nach "1000_" oder "1000_abc").
Grüße
bastla
Das könnte etwa so gehen:
@echo off & setlocal
set "Quelle=c:\temp"
set "Ziel=d:test"
set "Prot=%Quelle%\Protokoll_%date:~-4%-%date:~-7,2%-%date:~-10,2%_%time:~,2%%time:~3,2%%time:~6,2%.txt"
set "Prot=%Prot: =0%"
del "%Prot%" 2>nul
pushd "%Quelle%"
for /f "tokens=1* delims=_" %%i in ('dir /b /a-d *_*.* 2^>nul') do (
set "Done="
for /d %%a in ("%Ziel%\%%i_?") do if not defined Done (
copy "%%i_%%j" "%%a" >nul
set "Done=True"
)
)
popd
for /d %%a in ("%Ziel%\*_?") do call :ProcessDir "%%a"
goto :eof
:ProcessDir
set "Zeile=%~f1 enthaelt"
for /f "delims=" %%i in ('dir /b /a-d %1 2^>nul') do call :ProcessFile "%%i"
>>"%Prot%" echo %Zeile:~,-1%
>>"%Prot%" echo\
goto :eof
:ProcessFile
set "Zeile=%Zeile% %~1,"
goto :eof
Mit einer alternativen Schreibweise der Protokolleinträge ließe sich das noch kompakter formulieren:
@echo off & setlocal
set "Quelle=c:\temp"
set "Ziel=d:test"
set "Prot=%Quelle%\Protokoll_%date:~-4%-%date:~-7,2%-%date:~-10,2%_%time:~,2%%time:~3,2%%time:~6,2%.txt"
set "Prot=%Prot: =0%"
del "%Prot%" 2>nul
pushd "%Quelle%"
for /f "tokens=1* delims=_" %%i in ('dir /b /a-d *_*.* 2^>nul') do (
set "Done="
for /d %%a in ("%Ziel%\%%i_?") do if not defined Done (
copy "%%i_%%j" "%%a" >nul
set "Done=True"
)
)
popd
for /d %%a in ("%Ziel%\*_?") do (
echo %%~fa
dir /b /a-d %%a 2>nul
echo\
)>>"%Prot%"
Zum jeweiligen Zielordner wäre noch zu erwähnen, dass in den ersten Ordner, dessen Name mit "<Teil 1 Dateiname>_" (also: Zeichenkette des Dateinamens bis zum ersten "_" + "_") entspricht, kopiert wird (auch wenn nach dem "_" nix oder mehr als ein Zeichen folgt - daher auch nach "1000_" oder "1000_abc").
Grüße
bastla
Hallo mapl99sb!
Nö - das in Zeile 18 hattest Du ja auch schon gefunden ...
Mach doch mal aus dem "
Außerdem kann's nicht schaden, die Zeile 20 auf
zu ändern ... (Alle angegebenen Zeilen beziehen sich auf den zweiten Ansatz.)
[Edit] Im ersten Batch fehlte in Zeile 29 das schließende Anführungszeichen - ist oben bereits nachgetragen (auch wenn's daran eigentlich nicht gelegen haben sollte); falls Du auch diesen Batch mit "
Grüße
bastla
Was noch nicht klappt ist das Protokoll. Er zeigt mir nur die Pfade an, nicht die Dateien im Zielpfad.
Hast du eine Idee, woran es liegen könnte?
Am "?" ? Hast du eine Idee, woran es liegen könnte?
Mach doch mal aus dem "
echo off
" ein "echo on
" und starte den Batch aus einem CMD-Fenster bzw füge am Ende noch eine Zeile mit "pause
" hinzu - dann siehst Du, was genau passiert (und hoffentlich auch, warum etwas nicht passiert) ...Außerdem kann's nicht schaden, die Zeile 20 auf
dir /b /a-d "%%a" 2>nul
[Edit] Im ersten Batch fehlte in Zeile 29 das schließende Anführungszeichen - ist oben bereits nachgetragen (auch wenn's daran eigentlich nicht gelegen haben sollte); falls Du auch diesen Batch mit "
pause
" testen wolltest, müsste das zwischen die Zeilen 18 und 19 ... [/Edit]Grüße
bastla
Hallo mapl99sb!
Es könnte aber (ungetestet) etwa so gehen:
Grüße
bastla
Gibt es eine Anweisung, mit der man das Ergebnis in %%i eindeutig machen kann, daß also die Dateinamen nur 1x vorkommen?
Gibt es so nicht, da ja jede Datei "betrachtet" werden muss und sich %%i aus der Zerlegung des jeweiligen Dateinamens ergibt.Es könnte aber (ungetestet) etwa so gehen:
set "Liste=%temp%\Liste.txt"
copy nul "%Liste%"
for /f "tokens=1* delims=_" %%i in ('dir /b /a-d *_*.* 2^>nul') do findstr "%%i" "%Liste%" || (
>>"%Liste%" echo %%i
for /d %%a in ("%Ziel%\%%i -*") do (
echo %%~fa
dir /b /a-d "%%a" 2>nul
echo\
)>>"%Prot%"
)
bastla
Moin @mapl99sb,
bitte erstelle eine neue Frage.
Dieser Thread ist ja mittlerweile doch schon in die Jahre gekommen (und die Grundfrage ist ja gelöst) ...
... du kannst bei der neuen Frage gerne auf diese verlinken ...
... bitte beachte die Formatierungshilfe (FAQ) - vor allem die Code-Formatierung
Gruß
@kontext (Mod)
bitte erstelle eine neue Frage.
Dieser Thread ist ja mittlerweile doch schon in die Jahre gekommen (und die Grundfrage ist ja gelöst) ...
... du kannst bei der neuen Frage gerne auf diese verlinken ...
... bitte beachte die Formatierungshilfe (FAQ) - vor allem die Code-Formatierung
Gruß
@kontext (Mod)