Tägliche Kopie mittles Batchdatei
Ich will einmal täglich eine Kopie einer Datei (Dateiname bleibt gleich) aus einem täglich neu erstellten Ordner (Name ist das Datumn dieser Form: YYYYMMDD)mit Hilfe einer Batchdatei machen.
Hallo liebes Forum...
Wie schon im Vorwort erwähnt versuche ich, täglich eine Kopie einer Datei (Datenbankauszug - Dateiname bleibt immer gleich)zu erstellen.
Diese Datei wird jeden Tag in automatisch in einem neuen Ordner aktualisiert abgelegt.
Aus diesem Ordner möchte ich die Datei einmal täglich ein ein temporäres Verzeichnis kopieren.
Der Ordner hat folgenden Namen und Form "YYYYMMDD_HHMMSS"
Das Datum vor dem underscore krieg ich noch hin (aktuelles Datum - für ganze Tag).
Jedoch bei den Stunden, Minuten und Sekunden (hinter underscore) tue ich mir schwer, da diese Zeit ja nicht mehr aktuell ist.
Nun dachte ich an eine Wildcard bzw Regex um den beliebigen Zahlenwert (6-stellig) zu filtern, da die Ablage nicht immer zum exakt gleichen Zeitpunkt erfolgt und somit immer irgendeine 6stellige Zahl ist.
Anbei mal meine Batch der grundsätzlich funktioniert aber leider nur bis zum underscore...
@echo off &setlocal
set "StartOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet"
set "ZielOrdner=C:\TEMP\Intranet"
set "DateiMaske=*SFBFIR016.txt*"
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set "OrdnerMaske=%jahr%%tag%%monat%"
set "QuellOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_"
for /d /r "%StartOrdner%" %%i in (*.*) do if not defined QuellOrdner if "%%~nxi" equ "%OrdnerMaske%" set "QuellOrdner=%%~i"
if not defined QuellOrdner echo Ordner %OrdnerMaske% nicht gefunden&goto:eof
copy "%QuellOrdner%\%DateiMaske%" "%ZielOrdner%"
endlocal
Genau für diese Zeile benötige ich einen Ausdruck der mir nach dem underscore jeder beliebige 6-stellige Zahl übernimmt:
set "QuellOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_"
Da ich schon seit langem Suche bzw nicht sicher bin ob das mit Regex überhaupt funktioniert oder wie ich es einbetten soll, wäre ich für jede Hilfe/Anmerkung sehr dankbar.
Liebe Grüsse
Philipp
Hallo liebes Forum...
Wie schon im Vorwort erwähnt versuche ich, täglich eine Kopie einer Datei (Datenbankauszug - Dateiname bleibt immer gleich)zu erstellen.
Diese Datei wird jeden Tag in automatisch in einem neuen Ordner aktualisiert abgelegt.
Aus diesem Ordner möchte ich die Datei einmal täglich ein ein temporäres Verzeichnis kopieren.
Der Ordner hat folgenden Namen und Form "YYYYMMDD_HHMMSS"
Das Datum vor dem underscore krieg ich noch hin (aktuelles Datum - für ganze Tag).
Jedoch bei den Stunden, Minuten und Sekunden (hinter underscore) tue ich mir schwer, da diese Zeit ja nicht mehr aktuell ist.
Nun dachte ich an eine Wildcard bzw Regex um den beliebigen Zahlenwert (6-stellig) zu filtern, da die Ablage nicht immer zum exakt gleichen Zeitpunkt erfolgt und somit immer irgendeine 6stellige Zahl ist.
Anbei mal meine Batch der grundsätzlich funktioniert aber leider nur bis zum underscore...
@echo off &setlocal
set "StartOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet"
set "ZielOrdner=C:\TEMP\Intranet"
set "DateiMaske=*SFBFIR016.txt*"
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set "OrdnerMaske=%jahr%%tag%%monat%"
set "QuellOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_"
for /d /r "%StartOrdner%" %%i in (*.*) do if not defined QuellOrdner if "%%~nxi" equ "%OrdnerMaske%" set "QuellOrdner=%%~i"
if not defined QuellOrdner echo Ordner %OrdnerMaske% nicht gefunden&goto:eof
copy "%QuellOrdner%\%DateiMaske%" "%ZielOrdner%"
endlocal
Genau für diese Zeile benötige ich einen Ausdruck der mir nach dem underscore jeder beliebige 6-stellige Zahl übernimmt:
set "QuellOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_"
Da ich schon seit langem Suche bzw nicht sicher bin ob das mit Regex überhaupt funktioniert oder wie ich es einbetten soll, wäre ich für jede Hilfe/Anmerkung sehr dankbar.
Liebe Grüsse
Philipp
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 203955
Url: https://administrator.de/forum/taegliche-kopie-mittles-batchdatei-203955.html
Ausgedruckt am: 16.02.2025 um 20:02 Uhr
30 Kommentare
Neuester Kommentar
Hallo philodendron,
wenn du ein Betriebssystem hast, das den Befehl forfiles kennt solltest du dir den mal anschauen.
Der Befehl kennt einen Parameter /D
Damit kannst du mit folgendem Befehl alle Dateien und Verzeichnis ausgeben lassen, die z.B. seit heute modifiziert wurden :
Gruß
Andi
wenn du ein Betriebssystem hast, das den Befehl forfiles kennt solltest du dir den mal anschauen.
Der Befehl kennt einen Parameter /D
Damit kannst du mit folgendem Befehl alle Dateien und Verzeichnis ausgeben lassen, die z.B. seit heute modifiziert wurden :
forfiles /D %date% /P "%QuellOrdner%"
Gruß
Andi
Hallo Philipp,
wenn nur eine Kopie istd die Uhrzeit im dateiname irelevant und du könntest die Uhrzeit einfach fallen lassen
Falls Interesse an Dateierstellungszeit vorhanden, die werden so wie so mit der Erschafung der neuen Datei in den Eigenschaften eingetragen.
Damit die ganze Benennung YYYYMMDD_HHMMSS angewendet werden kann, sollst du einfach als Variable(Set) festdefinieren
LG,
Ticuta1
Zitat von @philodendron:
Hallo liebes Forum...
Wie schon im Vorwort erwähnt versuche ich, täglich eine Kopie einer Datei (Datenbankauszug - Dateiname bleibt immer
gleich)zu erstellen.
Hallo liebes Forum...
Wie schon im Vorwort erwähnt versuche ich, täglich eine Kopie einer Datei (Datenbankauszug - Dateiname bleibt immer
gleich)zu erstellen.
wenn nur eine Kopie istd die Uhrzeit im dateiname irelevant und du könntest die Uhrzeit einfach fallen lassen
Falls Interesse an Dateierstellungszeit vorhanden, die werden so wie so mit der Erschafung der neuen Datei in den Eigenschaften eingetragen.
Damit die ganze Benennung YYYYMMDD_HHMMSS angewendet werden kann, sollst du einfach als Variable(Set) festdefinieren
LG,
Ticuta1
Hallo philodendron und willkommen im Forum!
![face-wink face-wink](/images/icons/fa/light/face-laugh-wink.svg)
Also jetzt noch mal ganz genau: Wo liegt denn die Datei "SFBFIR016.txt"? Wenn unmittelbar in "\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\20130326*" sollte sich das Kopieren doch (ungetestet) so machen lassen:
Alternativ kannst Du natürlich auch zuerst den Quellordner in die entsprechende Variable packen und den auf die selbe Art ermitteln:
Grüße
bastla
ich überseh irgendwas
Ich seh auch nur noch Sterne - oder jedenfalls zu viele davon ... Also jetzt noch mal ganz genau: Wo liegt denn die Datei "SFBFIR016.txt"? Wenn unmittelbar in "\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\20130326*" sollte sich das Kopieren doch (ungetestet) so machen lassen:
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\%DateiMaske%" "%ZielOrdner%"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*") do set "Quellordner=%%i"
bastla
Hallo philodendron,
schau mal diese einleitung...http://www.heisig-it.de/batch.htm vielleicht hilft bei der Lösungsuche.
LG,
ticuta1
schau mal diese einleitung...http://www.heisig-it.de/batch.htm vielleicht hilft bei der Lösungsuche.
LG,
ticuta1
Hallo philodendron!
Bitte verwende zum Posten von Code die passende Formatierung.
Grüße
bastla
Bitte verwende zum Posten von Code die passende Formatierung.
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*\01") do copy "%%i\%DateiMaske%" "%ZielOrdner%"
In meinem Beispiel gab es aber kein "\01" am Ende des Pfades ...Grüße
bastla
Sorry wenn ich mich einmische - aber warum verwendet ihr einen Pfad zum testen, bei dem die Fehler bereits vorprogrammiert sind?
Für sowas erstelle ich mir ein Verzeichnis c:\tmp und kann darin rumwursteln.
Wenn die Batch funktioniert, kann man den Pfad mit dem "echten" erweitern...
Ich hab übrigens auch etwas rumgemurkst - wenn man irgendwie das Ergebnis von "dir /b 20130326_*" in eine Variable bringen könnte, käme man weiter. Aber das bring ich einfach nicht hin...
Für sowas erstelle ich mir ein Verzeichnis c:\tmp und kann darin rumwursteln.
Wenn die Batch funktioniert, kann man den Pfad mit dem "echten" erweitern...
Ich hab übrigens auch etwas rumgemurkst - wenn man irgendwie das Ergebnis von "dir /b 20130326_*" in eine Variable bringen könnte, käme man weiter. Aber das bring ich einfach nicht hin...
Zitat von @leknilk0815:
Ich hab übrigens auch etwas rumgemurkst - wenn man irgendwie das Ergebnis von "dir /b 20130326_*" in eine Variable
bringen könnte, käme man weiter. Aber das bring ich einfach nicht hin...
Ich hab übrigens auch etwas rumgemurkst - wenn man irgendwie das Ergebnis von "dir /b 20130326_*" in eine Variable
bringen könnte, käme man weiter. Aber das bring ich einfach nicht hin...
Hallo leknilk0815,
das geht ja mit einer for Schleife:
for /f "delims=" %%i in ('dir /ad /b 20130326_*') do set "Ordner=%%i"
bb
Danke!
dann probier mal das hier aus:
der "md" erzeugt hier ein (dummy)- Verzeichnis, damit man die Batch in einem leeren Test-Verzeichnis probieren kann.
Die Batch ist natürlich nicht fertig, aber vielleicht hilft der Denkansatz weiter...
Edit:
Wenn man dann noch:
kommt man der Sache schon näher...
dann probier mal das hier aus:
@for /F "tokens=1,2,3,4,5 delims=. " %%a in ('date /t') do set jahrdat=%%c
@for /F "tokens=1,2,3,4,5 delims=. " %%a in ('date /t') do set mondat=%%b
@for /F "tokens=1,2,3,4,5 delims=. " %%a in ('date /t') do set tagdat=%%a
@for /F "tokens=1,2,3,4,5 delims=. " %%a in ('time /t') do set mindat=%%a
pause
set mindat=%mindat::=%
md %jahrdat%%mondat%%tagdat%_%mindat%00
pause
echo %jahrdat%%mondat%%tagdat%_
pause
dir /b %jahrdat%%mondat%%tagdat%_*
pause
for /f "delims=" %%i in ('dir /ad /b 20130326_*') do set "Ordner=%%i"
pause
md %ordner%-test
pause
der "md" erzeugt hier ein (dummy)- Verzeichnis, damit man die Batch in einem leeren Test-Verzeichnis probieren kann.
Die Batch ist natürlich nicht fertig, aber vielleicht hilft der Denkansatz weiter...
Edit:
Wenn man dann noch:
for /f "delims=" %%i in ('dir /ad /b 20130326_*') do set "Ordner=%%i"
ersetzt durch:
for /f "delims=" %%i in ('dir /ad /b %jahrdat%%mondat%%tagdat%_*') do set "Ordner=%%i"
kommt man der Sache schon näher...
Hallo philodendron!
Oben habe ich ja schon einmal gefragt, wo denn die Datei "SFBFIR016.txt" genau liegt (und bisher keine Antwort erhalten) - sollte es im Unterordner "01" sein, dann so:
Grüße
bastla
wenn ich in der batchdatei das \01 dazu füge ...
Und warum tust Du das?Oben habe ich ja schon einmal gefragt, wo denn die Datei "SFBFIR016.txt" genau liegt (und bisher keine Antwort erhalten) - sollte es im Unterordner "01" sein, dann so:
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%
bastla
Hallo philodendron (und auch leknilk0815)!
Darf ich nochmals auf die Formatierungsmöglichkeit für "Code" hinweisen? Außerdem: Wie kann ich einen Beitrag als gelöst markieren? ...
Etwas entschlackt sollte übrigens auch
genügen. Wenn übrigens der Dateiname mit zB "SFBFIR015.txt" ohnehin feststeht, kann er auch gleich als Dateimaske und zum Umbenennen verwendet werden (macht das Ganze etwas flexibler / leichter wartbar):
und da ja
eigentlich die Ordnermaske ist (das wäre schließlich der Sinn dieser Variablen), ließe sich (zusammen mit der Verwendung von %StartOrdner%) weiter verkürzen auf:
Grüße
bastla
Darf ich nochmals auf die Formatierungsmöglichkeit für "Code" hinweisen? Außerdem: Wie kann ich einen Beitrag als gelöst markieren? ...
Etwas entschlackt sollte übrigens auch
@echo off &setlocal
set "StartOrdner=\\NAS03\efcom\P\Datentraeger\SQLExport\intranet"
set "ZielOrdner=C:\TEMP\Intranet"
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set "OrdnerMaske=%jahr%%tag%%monat%"
rem Kopie Datei "sfbfir015.txt" aus \\NAS03\efcom\P\Datentraeger\SQLExport\intranet\YYYYMMDD_(Platzhalter 6-stellige Zahl)\01
set "DateiMaske=*sfbfir015.txt*"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%"
rem Kopie Datei "sfbfir015.txt" aus \\NAS03\efcom\P\Datentraeger\SQLExport\intranet\zession\YYYYMMDD_(Platzhalter 6-stellige Zahl)\01 -> umbenannt in "zession_sfbfir015.txt"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\zession\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%\Zession_SFBFIR015.txt"
rem Kopie Datei "sfbfir016.txt" aus \\NAS03\efcom\P\Datentraeger\SQLExport\intranet\YYYYMMDD_(Platzhalter 6-stellige Zahl)\01
set "DateiMaske=*sfbfir016.txt*"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%"
rem Kopie Datei "sfbfir016.txt" aus \\NAS03\efcom\P\Datentraeger\SQLExport\intranet\zession\YYYYMMDD_(Platzhalter 6-stellige Zahl)\01 -> umbenannt in "zession_sfbfir016.txt"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\zession\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%\Zession_SFBFIR016.txt"
rem Kopie Datei "sfbfir015.txt" aus \\NAS03\efcom\P\Datentraeger\SQLExport\intranet\YYYYMMDD_(Platzhalter 6-stellige Zahl)\01
set "DateiMaske=SFBFIR015.txt"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%"
rem Kopie Datei "sfbfir015.txt" aus \\NAS03\efcom\P\Datentraeger\SQLExport\intranet\zession\YYYYMMDD_(Platzhalter 6-stellige Zahl)\01 -> umbenannt in "zession_sfbfir015.txt"
for /d %%i in ("\\NAS03\efcom\P\Datentraeger\SQLExport\intranet\zession\%date:~6,4%%date:~3,2%%date:~0,2%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%\Zession_%Dateimaske%"
%date:~6,4%%date:~3,2%%date:~0,2%
for /d %%i in ("%StartOrdner%\zession\%Ordnermaske%_*") do copy "%%i\01\%DateiMaske%" "%ZielOrdner%\Zession_%Dateimaske%"
bastla
Sorry, die Funktion habe ich als Menü vermisst, daher ohne.
Da das aber per Hand
geht, werde ich das beherzigen.
Danke!
Erledigt!![face-smile face-smile](/images/icons/fa/light/face-smile.svg)
Da das aber per Hand
test
Danke!
Erledigt!
Hallo leknilk0815!
Das lässt sich auch nachträglich (oben) noch (durch "Bearbeiten") umsetzen ...
Grüße
bastla
[Edit] Danke
[/Edit]
Das lässt sich auch nachträglich (oben) noch (durch "Bearbeiten") umsetzen ...
Grüße
bastla
[Edit] Danke