mmarkuss
Goto Top

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

Content-Key: 201135

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

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: Pjordorf
Pjordorf 01.02.2013 um 13:14:52 Uhr
Goto Top
Hallo,

Zitat von @MmarKuss:
Durchblicker habe, wenn da noch etwas von mir anzupassen wäre. Machbar ?
Lass mal sehen was du schon an Batch hast? (Oder willst du nur das Geld für einen Programmierer sparenface-smile)

Gruß,
Peter
Mitglied: MmarKuss
MmarKuss 01.02.2013 aktualisiert um 13:25:44 Uhr
Goto Top
...die Peinlichkeit wollte ich mir eigentlich ersparen...

Aus einem anderen, im Netz gefundenen Skript habe ich versucht, etwas auf meine Bedürfnisse umzumodeln,
bin aber schon bei den ersten Versuchen kläglich gescheitert, da ich einfach die Syntax nicht verstehe.

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

...und wenn jetzt einer lacht : ich bin ziemlich gross und stark... face-smile
Mitglied: Pjordorf
Pjordorf 01.02.2013 um 13:59:17 Uhr
Goto Top
Hallo,

Zitat von @MmarKuss:
...die Peinlichkeit wollte ich mir eigentlich ersparen...
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.php

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 sehenface-smile Und Code Tags helfen uns dir im Quellcode weiter zu helfen. Warum? Schau mal:
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 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
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 14:20:38 Uhr
Goto Top
OK, ich geb auf.
Bei meinen "fundierten" Englischkenntnissen werde ich da nie durchsteigen.

Danke dennoch.

und Gruss

markus
Mitglied: bastla
bastla 01.02.2013 um 15:51:18 Uhr
Goto Top
Hallo MmarKuss!
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
ok oder sollen nur alle enthaltenen Dateien gelöscht werden?

Grüße
bastla
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 16:11:30 Uhr
Goto Top
Hallo Bastla,

dank Dir für dein posting, bin schon am verzweifeln.

Ich möchte aus dem Ordner D:\Schriftdaten ( der einige Unterodrdner enthält ) immer eine ( die neueste )
Datei mit der Endung *.doc, die neueste *.docx und *.txt
im Ordner D:\Schriftdaten_akt haben, wenn die batch ausgeführt ist .

D.h. im Ordner D:\Schriftdaten_akt sollten dann immer nur 3 dateien stehen ( es sei denn, ich erweitere das noch um z.B. xls Dateien )

also : pro Endung nur eine datei
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 16:15:11 Uhr
Goto Top
...war noch nicht fertig...

auch Unterordner mit einbeziehen,
OK, das mit dem *.doc und *.docx scheint ein prob zu sein - dann werde ich eben zusehen, dass hier keiner mehr das alte Word benutzt, also nur nach docx suchen lassen
D:\Schriftdaten_akt soll jedesmal komplett gelöscht werden

Danke
Mitglied: bastla
bastla 01.02.2013 aktualisiert um 16:42:22 Uhr
Goto Top
Hallo MmarKuss!

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  
Kurze Erklärung:
  • Mit der "%%t"-Schleife werden die verschiedenen Typen der Reihe nach abgearbeitet.
dir /s/b/a-d "%Basis%\*.%%t" 2^>nul^|findstr /ie "\.%%t"
sucht alle dem aktuellen Typ entsprechenden Dateien und unterscheidet durch Filterung auch "doc" und "docx".
  • 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
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 16:52:56 Uhr
Goto Top
Du bist genial, DANKE !!!

Wenn Du mir jetzt noch erzählen kannst ( was ich leider vergessen habe ) wie ich die neueste
background.jpg ( also fixer Name plus fixe Endung, aber eben die aktuellste im gesamten Ordner) mit dazu in D:\Schriftdaten_akt einkopieren kann,
bist Du heute für mich der Held face-smile

Gruss

markus
Mitglied: bastla
bastla 01.02.2013 aktualisiert um 18:09:31 Uhr
Goto Top
Hallo MmarKuss!

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  
Im Unterschied zur Version 1 werden hier die Trennzeichen vor dem jeweiligen Suchbegriff (also "." oder "\") mitgeliefert und die Selektion erfolgt nur per "findstr" ...

Grüße
bastla
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 20:04:31 Uhr
Goto Top
Hi Bastla,

bösartig, wie ich nun mal bin ( face-smile ) , habe ich Alles versucht, um Deine batch auszutricksen - keine Chance.

Also: Ein turbodickes Dankeschön an Dich !!!

Jetzt will ich nur noch nen kleinen Schönheitsfehler in den Griff bekommen - wenns geht.
Wenn ich in der batch am Schluss word.exe öffne, ( start C:\Winword\word.exe ) dann bleibt mir das minimierte cmd-Fenster unten in der Leiste stehen, nachdem ich die batch über eine Verknüpfung minimiert geöffnet habe.

Gibts dazu noch nen Trick?

Grüsse von

Martin
Mitglied: bastla
bastla 01.02.2013 um 20:33:49 Uhr
Goto Top
Hallo MmarKuss!

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 Batches
start C:\Winword\word.exe
lautet, sollte es noch nicht einmal eines
exit
dahinter bedürfen, um den Batch zu beenden ...

Grüße
bastla
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 21:58:33 Uhr
Goto Top
Hallo Bastla,

nachdem ich das halbe Netz durchsucht habe, verstehe ich es eben auch nicht.

meine letzten Zeilen sehen so aus:


)
del "%Liste%" 2>nul

start C:\Winword\word.exe
EXIT

Word wird geöffnet , aber das cmd-Fenster bleibt im Hintergrund offen ( aber nur, wenn ich den Start-Befehl für word anhänge ).
Wenn ich die bat über eine Verknüpfung öffne, so ist es etwas hübscher, aber das minimierte Fenster bleibt in der Leiste stehen und ich muss es von Hand schliessen.

Aber egal, ist zwar nicht wirklich hübsch, aber der Sinn und Zweck der Übung wird ja erfüllt.

Gruss

Markus
Mitglied: MmarKuss
MmarKuss 01.02.2013 um 22:09:18 Uhr
Goto Top
Vielleicht gibt das noch jemand eine Idee:

im cmd-Fenster steht dann noch:


Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Winword>


Vielleicht muss ich erst wieder auf die C-Ebene zurück, damit sich das Teilchen von selbst wieder schliesst.
Mitglied: MmarKuss
MmarKuss 02.02.2013 um 00:04:21 Uhr
Goto Top
... und wenn man auf Bastla hört und nicht aus Eigenversuchen noch die erste Zeile mit

Start /min

stehen lässt, dann klappt´s auch mit der Optik.................................


Grüsse vom restlos begeisterten

Markus
Mitglied: MmarKuss
MmarKuss 24.01.2014 um 12:44:55 Uhr
Goto Top
Hallo allerseits...ich mal wieder und immer noch nichts dazu gelernt...sorry

Habe eine ähnliche Fragestellung wie oben, aber mit der Abänderung des Skripts von bastla bin ich kläglich gescheitert.... face-sad

Also:
ich möchte eine immer gleichlautende file ( welche immer neu überschrieben wird ) aus immer demselben Ordner kopieren und in den Ordner eines anderen Rechners im Netzwerk einkopieren.Innerhalb dieses Ordners werden permanent neue Unterordner eingefügt. Die Datei soll in den jeweils neuesten Ordner einkopiert werden.

Basis: D:\nctemp\test.doc diese test.doc soll eingefügt werden in
\\Z\Beschreibungen\ " hier in den Ordner mit dem aktuellsten Datum" .

Ergebnis sollte also beispielsweise dann so aussehen:

Z\\Beschreibungen\2014_01_24_12_43\test.doc


Machbar ?

Gruß und Dank im Voraus

Markus
Mitglied: bastla
bastla 24.01.2014 um 15:15:31 Uhr
Goto Top
Hallo MmarKuss!

Eigentlich eine andere Frage, passt aber irgendwie trotzdem unter den aussagekräftigen Threadtitel ... face-wink

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  
Wegen des "/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
Mitglied: MmarKuss
MmarKuss 24.01.2014 aktualisiert um 17:25:09 Uhr
Goto Top
Hallo bastla,

erst mal DANKE !!!!!!!!!!!! für Deine wieder mal schnelle Hilfe.
Das Ganze funktioniert prima, bis auf die Tatsache, dass er die test.doc in den Ordner "Beschreibungen" direkt einlädt, nicht aber in den darin liegenden neuesten Unterordner.
dies bei exakter Übernahme Deines Skriptes

Gruß

Markus
Mitglied: bastla
Lösung bastla 24.01.2014, aktualisiert am 25.01.2014 um 15:40:47 Uhr
Goto Top
Hallo MmarKuss!

Funktioniert zwar bei mir (inzwischen getestet face-wink), aber Du kannst ja einfach aus dem "echo off" ein "echo on" machen und Dir genau den Ablauf ansehen, um eine Erklärung dafür zu finden, dass offensichtlich "%Neuester%" bei Dir leer bleibt ...

Grüße
bastla
Mitglied: MmarKuss
MmarKuss 25.01.2014 aktualisiert um 16:29:48 Uhr
Goto Top
Hallo Bastla,

,irgendetwas läuft bei mir dabei total schief:
Wenn ich Ziel =\\Z\Beschreibungen setze, kommt die Meldung, "Der Netzwerkpfad wurde nicht gefunden ", obwohl ich das verbundene Laufwerk Z über den explorer öffnen kann.
OK, dann anstatt dessen \\Calidia_959\D\Beschreibungen eingesetzt ( Calidia_959 = Computername, D ist das verknüpfte Laufwerk ) dann kommt die Meldung:

for /f "delims=" %i in ('dir /b/ad/on "\\Calidia_959\D\Beschreibungen\20*"') do set "Neuester=%i" Datei nicht gefunden,

er kopiert aber die test.doc in \\Calidia_959\D\Beschreibungen.
In diesem Ordner befinden sich aber mehrer Unterordner, welche er offensichtlich ignoriert....

Ich doof ???

Gruß Markus
Mitglied: bastla
bastla 25.01.2014 um 16:43:26 Uhr
Goto Top
Hallo MmarKuss!

Wenn Du das Laufwerk als Z: verbunden hast, dann wäre Zeile 3 natürlich
set "Ziel=Z:\Beschreibungen"
Ansonsten kannst Du natürlich auch zum Testen direkt in der CMD-Shell
dir /b/ad/on Z:\Beschreibungen
(also ohne "20*") eingeben, um so vielleicht Auffälligkeiten zu entdecken.
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
Mitglied: MmarKuss
MmarKuss 25.01.2014 um 17:05:01 Uhr
Goto Top
Bastla, Du bist einfach genial, danke. So funktioniert das.

Jetzt hoffe ich, dass Du mich nicht killst.........
In dem neuesten Unterordner in Z:\Beschreibungen befinden sich leider nochmals Unterordner ( woran ich nicht gedacht hatte....)
Die test.doc soll also in Z:\Beschreibungen\"neuester Unterordner" (hier liegt sie jetzt)\"neuester Unterordner" einkopiert werden.

Wenn das klappt bin ich happy über beide Ohren und wenn Du mal nach Heidelberg kommst, hast Du mindestens ein Bierchen gut..... face-smile

Ich hab mal im Internet rum recherchiert, aber nichts Gescheites zu Folgendem gefunden.

Gibt es eigentlich irgendwo eine gute Lernanleitung für die Batch-Programmierung ( z.B. die Syntax von "delims" richtig verstehen ) ?
Ich fürchte nämlich dass demnächst mehr an Batches auf mich zukommen könnte und ich mag net immer so doof fragen......

Gruß

Markus
Mitglied: bastla
bastla 25.01.2014 um 17:12:10 Uhr
Goto Top
Hallo MmarKuss!

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
Mitglied: MmarKuss
MmarKuss 25.01.2014 um 17:41:12 Uhr
Goto Top
Hallo Bastla,

wenn ich Folgendes schreibe:

@echo on & setlocal
set "Quelle=D:\nctemp\test.doc"
set "Ziel=Z:\Beschreibungen"

for /f "delims=" %%i in ('dir /b/ad/on Z:\Beschreibungen') do set "Neuester=%%i"
copy "%Quelle%" "%Ziel%\%Neuester%\" >nul

, dann schreib er brav die test.doc in den neuesten Ordner Im Verzeichnis Z.\Beschreibungen.


Sobald ich aber den string %Neuester%\20*" ins Spiel bringe, kommt die Meldung:

Datei nicht gefunden

So hab ich versucht, Deinen Tip umzusetzen:

@echo on & setlocal
set "Quelle=D:\nctemp\test.doc"
set "Ziel=Z:\Beschreibungen"

for /f "delims=" %%i in ('dir /b/ad/on "%Ziel%\%Neuester%\20*"') do set "Zielordner=%%i"
copy "%Quelle%" "%Ziel%\%Neuester%\%Zielordner%\" >nul
Resultat: Datei nicht gefunden

Gleiche Meldung bei:

@echo on & setlocal
set "Quelle=D:\nctemp\test.doc"
set "Ziel=Z:\Beschreibungen"

for /f "delims=" %%i in ('dir /b/ad/on "Z:\Beschreibungen\%Neuester%\20*"') do set "Zielordner=%%i"
copy "%Quelle%" "%Ziel%\%Neuester%\%Zielordner%\" >nul


Hmpf.....


Gruß

Markus
Mitglied: MmarKuss
MmarKuss 25.01.2014 um 18:41:53 Uhr
Goto Top
Hallo Bastla,

Dank nochmals für Deine Hilfe !!!

Hab jetzt mal selbst ein bisschen gespielt und versucht, den "gesunden Menschenverstand" einzusetzen. Hierbei ist Folgendes herausgekommen:

echo on & setlocal
set "Quelle=D:\nctemp\test.doc"
set "Ziel=Z:\Beschreibungen"

for /f "delims=" %%i in ('dir /b/ad/od Z:\Beschreibungen') do set "Neuester=%%i"
for /f "delims=" %%f in ('dir /b/ad/tc Z:\Beschreibungen\%Neuester%') do set "Zielordner=%%f"
copy "%Quelle%" "Z:\Beschreibungen\%Neuester%\%Zielordner%\" >nul


Nicht zu fassen, aber wahr: Es funktioniert.

Gruß

Markus
Mitglied: bastla
bastla 25.01.2014 um 20:23:58 Uhr
Goto Top
Hallo MmarKuss!
versucht, den "gesunden Menschenverstand" einzusetzen.
Keine ganz schlechte Idee ... face-wink

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
Mitglied: MmarKuss
MmarKuss 26.01.2014 um 13:46:30 Uhr
Goto Top
Hallo Bastla,

"Keine ganz schlechte Idee ... " ....das nehm ich jetzt ganz uneingebildet einfach mal als Kompliment... face-smile

Wie das Datum im Hintergrund von Windows gespeichert wird: keine Ahnung, im explorer angezeigt wird es als
24.01.2014 12:43 ... um Dein Beispiel zu übernehmen.

Das mit der Eleganz habe ich dankend übernommen.

Grüße von

Markus
Mitglied: bastla
bastla 26.01.2014 um 14:59:50 Uhr
Goto Top
Hallo MmarKuss!
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