Immer wieder probs mit der batch-Datei
Ihr habt mir vor ein paar Monaten schon mal mit einem ähnlichen prob geholfen.
Ich stelle mich aber irgendwie doof an, wenn ich das mit den batches selbst machen soll - sorry.
Hallo an Alle,
Problemstellung:
Im Ordner D:\Schriftdaten gibt es beliebig viele Unterordner
nun möchte ich in diesem Ordner alle Unterordner nach der neuesten *.doc, der neuesten *.docx und neuesten *.txt durchsuchen und die gefundenen Dateien in den Ordner D:\Schriftdaten_akt kopieren. Hierbei kann es vorkommen, dass eine Datei mit exakt gleichem Namen/Datum/Uhrzeit mehrfach in den Unterverzeichnissen vorhanden ist. Diese sollte dann nur einmal kopiert werden. Der Ordner D:\Schriftdaten_akt soll vor dem Kopieren jedesmal komplett gelöscht werden.
Hat jemand zufällig eine passende batch für mich, ausgehend von der Überlegung, dass ich wirklich nicht den grossen Durchblicker habe, wenn da noch etwas von mir anzupassen wäre. Machbar ?
Dank im Voraus
Markus
Ich stelle mich aber irgendwie doof an, wenn ich das mit den batches selbst machen soll - sorry.
Hallo an Alle,
Problemstellung:
Im Ordner D:\Schriftdaten gibt es beliebig viele Unterordner
nun möchte ich in diesem Ordner alle Unterordner nach der neuesten *.doc, der neuesten *.docx und neuesten *.txt durchsuchen und die gefundenen Dateien in den Ordner D:\Schriftdaten_akt kopieren. Hierbei kann es vorkommen, dass eine Datei mit exakt gleichem Namen/Datum/Uhrzeit mehrfach in den Unterverzeichnissen vorhanden ist. Diese sollte dann nur einmal kopiert werden. Der Ordner D:\Schriftdaten_akt soll vor dem Kopieren jedesmal komplett gelöscht werden.
Hat jemand zufällig eine passende batch für mich, ausgehend von der Überlegung, dass ich wirklich nicht den grossen Durchblicker habe, wenn da noch etwas von mir anzupassen wäre. Machbar ?
Dank im Voraus
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 201135
Url: https://administrator.de/forum/immer-wieder-probs-mit-der-batch-datei-201135.html
Ausgedruckt am: 19.02.2025 um 22:02 Uhr
28 Kommentare
Neuester Kommentar
Hallo,
Lass mal sehen was du schon an Batch hast? (Oder willst du nur das Geld für einen Programmierer sparen
)
Gruß,
Peter
Lass mal sehen was du schon an Batch hast? (Oder willst du nur das Geld für einen Programmierer sparen
Gruß,
Peter
Hallo,
Ich denke da muss dir gar nichts Peinlich sein.
Ein "echo off" bedeutet das alles was du nicht sehen willst unterdrückt wird. Erschwert erstmal die Fehlersuche. Also schnell ein "rem @echo off" dort eintragen. Dann wirst du schon mehr sehen
Und Code Tags helfen uns dir im Quellcode weiter zu helfen. Warum? Schau mal:
Mit REM werden Kommentare eingeleitet
Mit SET werden Variablen (und werte) definiert.
Das DIR listet Verzeichnissinhalte auf
Das > ist hier ein Umleitung der Ausgabe in einer benannten Datei
.
.
.
Gruß,
Peter
Ich denke da muss dir gar nichts Peinlich sein.
bin aber schon bei den ersten Versuchen kläglich gescheitert, da ich einfach die Syntax nicht verstehe.
Die kannst du in einem CMD Fenster mit Befehlsname /? oder Befehlsname /help dir anlesen. Hier eine sehr gute Seite http://www.robvanderwoude.com/batchfiles.phpEin "echo off" bedeutet das alles was du nicht sehen willst unterdrückt wird. Erschwert erstmal die Fehlersuche. Also schnell ein "rem @echo off" dort eintragen. Dann wirst du schon mehr sehen
rem @echo off
setlocal
set workdir="D:\Schriftdaten\"
set files=
dir %workdir% /A-D/B/OG-D>%temp%files.tmp
for /f "tokens=1* delims=" %%i in (%temp%files.tmp) do if not defined files set "files=%%i"
del %temp%files.tmp
echo %files%
xcopy %files% "D:\Schriftdaten_akt\"
pause
Mit SET werden Variablen (und werte) definiert.
Das DIR listet Verzeichnissinhalte auf
Das > ist hier ein Umleitung der Ausgabe in einer benannten Datei
.
.
.
Gruß,
Peter
Hallo MmarKuss!
ok oder sollen nur alle enthaltenen Dateien gelöscht werden?
Grüße
bastla
alle Unterordner nach der neuesten *.doc, der neuesten *.docx und neuesten *.txt durchsuchen
- Meinst du damit jeweils nur eine Datei oder die neueste je Unterordner?
- Sind auch Unter-Unterordner mit einzubeziehen?
- Sollen tatsächlich "doc"- und "docx"-Dateien getrennt erfasst werden (Batch macht bei "*.doc" nämlich keinen Unterschied und liefert Dateien mit beiden Erweiterungen)?
Der Ordner D:\Schriftdaten_akt soll vor dem Kopieren jedesmal komplett gelöscht werden.
- Wäre demnach ein
rd /s /q D:\Schriftdaten_akt
Grüße
bastla
Hallo MmarKuss!
Das könnte etwa so gehen:
Kurze Erklärung:
sucht alle dem aktuellen Typ entsprechenden Dateien und unterscheidet durch Filterung auch "doc" und "docx".
Grüße
bastla
Das könnte etwa so gehen:
@echo off & setlocal
set "Basis=D:\Schriftdaten"
set "Ziel=D:\Schriftdaten_akt"
set "Typen=doc docx txt"
rd /s /q "%Ziel%" 2>nul
md "%Ziel%"
set "Liste=%temp%\Dateiliste.txt"
for %%t in (%Typen%) do (
del "%Liste%" 2>nul
for /f "delims=" %%f in ('dir /s/b/a-d "%Basis%\*.%%t" 2^>nul^|findstr /ie "\.%%t"') do (
for /f "tokens=1-5 delims=.: " %%a in ("%%~tf") do (
>>"%Liste%" echo %%c%%b%%a%%d%%e %%~ff
)
)
if exist "%Liste%" (
for /f "tokens=1*" %%k in ('sort "%Liste%"') do set "Latest=%%l"
setlocal enabledelayedexpansion
echo "!Latest!"
copy "!Latest!" "%Ziel%\">nul
endlocal
)
)
del "%Liste%" 2>nul
- Mit der "%%t"-Schleife werden die verschiedenen Typen der Reihe nach abgearbeitet.
dir /s/b/a-d "%Basis%\*.%%t" 2^>nul^|findstr /ie "\.%%t"
- Für jede gefundene Datei (vollständiger Pfad in "%%f") wird das Änderungsdatum (samt Uhrzeit) ausgelesen und im Format "JJJJMMTThhss Dateipfad" in eine Temp-Datei geschrieben.
- Nachdem alle gefundenen Dateien verarbeitet wurden, wird (falls überhaupt eine Datei in der Temp-Datei steht) die Temp-Datei sortiert und der Pfad der letzten Datei (= höchster Datumswert = neueste) zwischengespeichert, zur Information ausgegeben und schließlich die Datei kopiert.
Grüße
bastla
Hallo MmarKuss!
Die Kombination "nur Typ" und "Dateiname" ist etwas tricky, sollte sich aber so lösen lassen:
Im Unterschied zur Version 1 werden hier die Trennzeichen vor dem jeweiligen Suchbegriff (also "." oder "\") mitgeliefert und die Selektion erfolgt nur per "
Grüße
bastla
Die Kombination "nur Typ" und "Dateiname" ist etwas tricky, sollte sich aber so lösen lassen:
@echo off & setlocal
set "Basis=D:\Schriftdaten"
set "Ziel=D:\Schriftdaten_akt"
set "Dateien=.doc .docx .txt .xls \background.jpg"
rd /s /q "%Ziel%" 2>nul
md "%Ziel%"
set "Liste=%temp%\Dateiliste.txt"
for %%t in (%Dateien%) do (
del "%Liste%" 2>nul
for /f "delims=" %%f in ('dir /s/b/a-d "%Basis%" 2^>nul^|findstr /ie "\%%t"') do (
for /f "tokens=1-5 delims=.: " %%a in ("%%~tf") do (
>>"%Liste%" echo %%c%%b%%a%%d%%e %%~ff
)
)
if exist "%Liste%" (
for /f "tokens=1*" %%k in ('sort "%Liste%"') do set "Latest=%%l"
setlocal enabledelayedexpansion
echo "!Latest!"
copy "!Latest!" "%Ziel%\">nul
endlocal
)
)
del "%Liste%" 2>nul
findstr
" ...Grüße
bastla
Hallo MmarKuss!
Kann ich leider nicht nachvollziehen - ein "
lautet, sollte es noch nicht einmal eines
dahinter bedürfen, um den Batch zu beenden ...
Grüße
bastla
Kann ich leider nicht nachvollziehen - ein "
start
" ohne "/wait
" bewirkt ja eigentlich, dass der Batch weiterläuft und nicht darauf wartet, dass das gestartete Programm beendet wird - wenn daher die letzte Zeile Deines Batchesstart C:\Winword\word.exe
exit
Grüße
bastla
Hallo MmarKuss!
Eigentlich eine andere Frage, passt aber irgendwie trotzdem unter den aussagekräftigen Threadtitel ...
Ungetestet etwa so:
Wegen des "
Grüße
bastla
Eigentlich eine andere Frage, passt aber irgendwie trotzdem unter den aussagekräftigen Threadtitel ...
Ungetestet etwa so:
@echo off & setlocal
set "Quelle=D:\nctemp\test.doc"
set "Ziel=\\Z\Beschreibungen"
for /f "delims=" %%i in ('dir /b/ad/on "%Ziel%\20*"') do set "Neuester=%%i"
copy "%Quelle%" "%Ziel%\%Neuester%\" >nul
/on
" wird der Name des Ordners für die Sortierung herangezogen - alternativ kannst Du auch "/od
", ev zusammen mit "/tc
" (für Erstellungs- anstatt Änderungsdatum) verwenden ...Grüße
bastla
Hallo MmarKuss!
Wenn Du das Laufwerk als Z: verbunden hast, dann wäre Zeile 3 natürlich
Ansonsten kannst Du natürlich auch zum Testen direkt in der CMD-Shell
(also ohne "20*") eingeben, um so vielleicht Auffälligkeiten zu entdecken.
Grüße
bastla
Wenn Du das Laufwerk als Z: verbunden hast, dann wäre Zeile 3 natürlich
set "Ziel=Z:\Beschreibungen"
dir /b/ad/on Z:\Beschreibungen
OK, dann anstatt dessen \\Calidia_959\D\Beschreibungen eingesetzt ( Calidia_959 = Computername, D ist das verknüpfte Laufwerk )
Was Du mit dem "D" meinst, kann ich nicht wirklich nachvollziehen - wenn der Ordner am Server "Calidia_959" unter dem Namen "Beschreibungen" freigegeben ist, lautet der (UNC-)Pfad "\\Calidia_959\Beschreibungen", unabhängig von einer etwaigen Laufwerksverknüpfung am Client ...Grüße
bastla
Hallo MmarKuss!
Wenn Du %Neuester% hast, kannst Du ja nach dem gleichen Muster fortsetzen:
Grüße
bastla
Wenn Du %Neuester% hast, kannst Du ja nach dem gleichen Muster fortsetzen:
...
for /f "delims=" %%i in ('dir /b/ad/on "%Ziel%\%Neuester%\20*"') do set "Zielordner=%%i"
copy "%Quelle%" "%Ziel%\%Neuester%\%Zielordner%\" >nul
Gibt es eigentlich irgendwo eine gute Lernanleitung für die Batch-Programmierung ( z.B. die Syntax von "delims" richtig verstehen ) ?
Genau dafür hat doch @Friemler sein Tutorial zur FOR-Schleife erstellt ...Grüße
bastla
Hallo MmarKuss!

Dass es jetzt funktioniert würde übrigens mE bedeuten, dass Deine Ordner nicht nach dem oben angeführten Beispiel "2014_01_24_12_43" benannt sind und deswegen zur Vorgabe "20*" kein Ordnername passt.
Eleganter (und änderungsfreundlicher) wird's noch, wenn Du jeweils "Z:\Beschreibungen" durch "%Ziel%" ersetzt.
Grüße
bastla
versucht, den "gesunden Menschenverstand" einzusetzen.
Keine ganz schlechte Idee ... Dass es jetzt funktioniert würde übrigens mE bedeuten, dass Deine Ordner nicht nach dem oben angeführten Beispiel "2014_01_24_12_43" benannt sind und deswegen zur Vorgabe "20*" kein Ordnername passt.
Eleganter (und änderungsfreundlicher) wird's noch, wenn Du jeweils "Z:\Beschreibungen" durch "%Ziel%" ersetzt.
Grüße
bastla
Hallo MmarKuss!
Grüße
bastla
Wie das Datum im Hintergrund von Windows gespeichert wird:
... war eigentlich gar nicht das Thema - anhand Deines Beispiels oben "2014_01_24_12_43" bin ich davon ausgegangen, dass die Ordner anhand des Datums benannt sind (deshalb auch die Sortierung mit "/on
", also nach Namen). Wenn die Namen der Ordner nicht das Kriterium sein sollen, dann müsste im "dir
" mit "/o-d
" sortiert werden ...Grüße
bastla