hqtoast
Goto Top

Datensicherungs Batch Datei schreiben

Ich bin gerade dabei zu lernen mit Batch Dateien zu Programmieren und habe ein Paar Probleme die ich nicht einfach Googeln kann.

Also das Ziel ist:

Ich klicke auf die .bat Datei und diese Kopiert dann die Daten aus Ordner "A" in einen Ordner "B". Die Kopierten Daten sollen aber nicht die Alten des Ordners "B" ersetzen. Die Kopierten Daten aus "A" sollen an ihren Original Dokumentnamen noch das aktuelle Datum bekommen und dann in Ordner "B" abgespeichert werden.

Bis jetzt bin ich so weit das die Daten aus Ordner "A" in Ordner"B" kopiert werden...

Ich nehme an das ein paar Leute sich jetzt die hand vor den Kopf schlagen aber ich hoffe trotzdem das mir jemand ein Paar Tipps, Befehle oder auch ein Vollständiges Programm geben kann.

Ich danke schon einmal im Vorraus für die Hilfe

Content-Key: 188079

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

Printed on: April 16, 2024 at 12:04 o'clock

Member: bastla
bastla Jul 16, 2012 updated at 13:16:58 (UTC)
Goto Top
Hallo HQToast und willkommen im Forum!

Eine wichtige Information fehlt dabei noch: Sind auch Unterordner zu berücksichtigen?

Außerdem hast Du nix über das Datumsformat gesagt ...

Im einfachsten Fall sähe das etwa so aus:
for /f "delims=" %%i in ('dir /b/a-d "D:\Ordner A"') do copy "D:\Ordner A\%%i" "D:\Ordner B\%%~ni%date%%%~xi"
Mehr dazu findest Du im Tutorial zur for-Schleife bzw in der Online-Hilfe (etwa mit "dir /?")...

Grüße
bastla

[Edit] "copy"-Befehl noch angepasst [/Edit]
Member: HQToast
HQToast Jul 16, 2012 updated at 11:29:03 (UTC)
Goto Top
Ok also danke erstmal für deine Antwort face-smile

Unterordner sind eigentlich nicht geplant aber es wäre interessant zu wissen was ich machen müsste um auch Unterordner miteinzubeziehen.

Beim Datumsformat wäre es einfach DD.MM.JJJJ und wenn es kaum einen Unterschied macht kännte man auch noch die Uhrzeit hinzufügen. SS.MM

Um Noch ein paar infos dazuzulegen. Die Ordner A und B sind bei mir unter C:\ abgelegt

Oh Gott ._. Ich versuche gerade nachzuvollziehen was du geschrieben hast :D ich bin überfordert... Aber ich gebe mir weiter mühe es zum funktionieren zu bringen...
Member: ColdZero89
ColdZero89 Jul 16, 2012 at 12:29:03 (UTC)
Goto Top
Moin Toasti,

willkommen in der Welt von Batch (ja auch ich sehe mich als Junger Padawan vom bastla)

Aber bei einem kann ich dir helfen, beim Datum.
Das Format sieht dann zwar so aus JJJJ.MM.DD, aber ich denke zur besseren sortierbarkeit, ist dies nicht weiter schlimm.

Variable mit dem Datum von heute belegen

set mydate=%date:~-4%%date:~-7,2%%date:~-10,2%
(Frag mich bitte nicht, ich bin bis heute dabei zu verstehen was das alles heißen soll face-big-smile)

Und um dieses dann von A nach B zu bekommen (Sicherlich arbeitest du mit xcopy):

xcopy /E /I /Q /O /J "PFAD A\DateiA" "PFAD B\%mydate%_DateiA"  

Fürs nachsehen was die Einstellungen heißen in der CMD xcopy /? eingeben.

Ich denke das sind die Sinnvollsten wobei /J nicht sein muss - ich denke nur das auch große Datein dabei sein werden.

Hoffe konnte helfen.

Gruß Zero
Member: HQToast
HQToast Jul 16, 2012 at 13:10:33 (UTC)
Goto Top
Also mit dem Namenändern bin ich leider noch nicht weitergekommen aber ich habe mir eine sinnvollere, zwar nicht i der Aufgabenstellung vorgegebene, Möglichkeit überlegt. Die Daten werden in einen Ordner der mit dem aktuellen Datum und Stunde reinkopiert. So erspart man sich den riesen berg an unübersichtlichen Daten mit hässlichen Endungen...


Das ich das mit dem namenändern nich hinbekommen...Naja wer weiß vll. stell ich mich auch zu blöd :D

Hier is mal das was ich jetzt geschafft habe:

@echo off

echo ---------------------------------Datensicherung--------------------------

FOR /F "tokens=1,2,3 delims=/: " %%a in ('Time/T') do set CTIME=%%a

set Quellpfad="C:\A"
set Zielpfad="C:\B\%date%_%ctime%Uhr"

echo Wollen sie die Dateien von
echo.
echo %Quellpfad%
echo.
echo nach
echo.
echo %Zielpfad%
echo.
echo kopieren?
echo.
echo.

set /p kopieren=[J/N]

if /i %kopieren%==J goto Ja
exit

:Ja

xcopy %Quellpfad% %Zielpfad% /S/D/Y/i
echo.
echo COMPLETE
pause


Also dafür das ich das erste mal was per batch programmiere finde ich habe ich das ganz gut gemacht XD

Sorry das ich das Programm normal reingeschrieben habe...wusste nicht wie man es so einfügen kann wie ihr ...
Member: bastla
bastla Jul 16, 2012, updated at Jul 17, 2012 at 10:30:51 (UTC)
Goto Top
Hallo HQToast!

Ist eigentlich nicht ganz so wild - aber bis Du das verlinkte Tutorial durch hast, wird's vielleicht ein wenig dauern, daher vorweg eine kurze Erklärung zu der Zeile:
for /f "delims=" %%i in
leitet eine Schleife ein, um alle Elemente des in der folgenden Klammer angegebenen Befehls (= hier alle Dateien des Ordners A) einzeln abzuarbeiten (und zwar so, dass der Dateiname nicht durch ev enthaltene Leerzeichen "zerrissen" würde)
dir /b/a-d "D:\Ordner A"
listet alle Dateien (aber wegen des "/a-d" keine Ordner) nur mit ihrem Namen (inkl Typ) auf.
copy "D:\Ordner A\%%i" "D:\Ordner B\%%~ni%date%%%~xi"
(ich habe noch die Angabe des Quellordners ergänzt) kopiert dann jede einzelne Datei (der Name steht in "%%i") in den Zielordner, wobei der Name neu erstellt wird aus:
  • %%~ni = "Original"-Dateiname (zB "DSC01453")
  • %date% = Datum in der Schreibweise "TT.MM.JJJJ" (Überlegungen zu einer Verbesserung hat ColdZero89 ja unten angestellt) und
  • %%~xi = Dateityp inkl Punkt davor (also etwa ".jpg")
- natürlich ließe sich zB auch mit
copy "D:\Ordner A\%%i" "D:\Ordner B\%%~ni_%date%%%~xi"
noch ein "_" als Trennzeichen vor dem Datum einbauen oder, nachdem vorweg die Zeile
set mydate=%date:~-4%%date:~-7,2%%date:~-10,2%
ausgeführt wurde, auch das umformatierte Datum mit
copy "D:\Ordner A\%%i" "D:\Ordner B\%%~ni_%mydate%%%~xi"
integrieren ...

Hinsichtlich der Uhrzeit kann die Zerlegung ähnlich wie beim Datum erfolgen - zu beachten wäre dabei allerdings, dass einstellige Zeiten nicht mit 0, sondern mit einem Leerzeichen beginnen, was mit einer nachträglichen Ersetzung der Art
>set "myTime=%myTime: =0%
angepasst werden kann ...

Grüße
bastla

[Edit]
Sorry das ich das Programm normal reingeschrieben habe...wusste nicht wie man es so einfügen kann wie ihr ...
Findest Du unter "Quellcode, Code oder HTML Snippets" in der Formatierungshilfe (und kannst Du auch nachträglich noch reineditieren) ...
[/Edit]
Member: bastla
bastla Jul 16, 2012, updated at Jul 17, 2012 at 10:19:38 (UTC)
Goto Top
@ColdZero89!
ich bin bis heute dabei zu verstehen was das alles heißen soll face-big-smile
Na komm - so ganz glaube ich Dir das nicht ... face-wink

Wie sich der Hilfe zu "set" entnehmen lässt, können mit der Tilde (~) Teilstrings gebildet werden - so bedeutet
%date:~-4%
einfach: Verwende die letzten 4 Zeichen der Variablen %date% (die das Tagesdatum - defaultmäßig mit 4-stelliger Jahreszahl) enthält.

Weshalb die letzten 4 Stellen und nicht 4 Stellen ab Position 7 - Schreibweise dafür:
%date:~6,4%
Unter W2000 wurde je nach Systemeinstellungen auch der Wochentag mit angegeben, sodass %date% dann zB
Mo 16.07.2012
enthielt - durch das Zerlegen "vom Ende her" konnte diese und auch die danach übliche Schreibweise (ohne Wochentag) mit dem gleichen Code verarbeitet werden ...
"xcopy" ist natürlich sinnvoll, weil bei Bedarf damit auch die benötigte Ordnerstruktur erstellt wird - allerdings kann so wie von Dir dargestellt das Datum nur in den Zielordner integriert werden - die einzelnen Dateinamen werden nicht um das Datum ergänzt ...

Grüße
bastla
Member: ColdZero89
ColdZero89 Jul 17, 2012 updated at 10:07:59 (UTC)
Goto Top
Moinsen

Na komm - so ganz glaube ich Dir das nicht ... face-wink

Haha. So grob versteh ichs ja face-wink es ist nur teilweise echt noch hirnverbrennend ^_^
Aber mit deiner erklärung ergibt das ganze gebilde für mich immernoch keinen genauen Sinn.
mydate=%date:~-4%%date:~-7,2%%date:~-10,2%

wieso -4? oder -7? ich hab nun gedacht 01.02.3456 wird ab der ersten 0 mit den stellen belegt..

verwirrend!!! ^^


"xcopy" ist natürlich sinnvoll, weil bei Bedarf damit auch die benötigte Ordnerstruktur erstellt wird -
allerdings kann so wie von Dir dargestellt das Datum nur in den Zielordner integriert werden - die einzelnen Dateinamen werden
nicht um das Datum ergänzt ...

Stimmt - nicht dran gedacht das der Kollege hier das Datum ZU dem eigentlichen Namen haben will - nagut dann Mixen wir deinen und meinen Vorschlag und dann geht das face-big-smile

Gruß Zero
Member: bastla
bastla Jul 17, 2012 updated at 10:28:05 (UTC)
Goto Top
Halo ColdZero89!
wieso -4? oder -7? ich hab nun gedacht 01.02.3456 wird ab der ersten 0 mit den stellen belegt..
Defaultmäßiges Datum:
17.07.2012
Position vom Ende her gezählt -4 und dann alle weiteren Stellen verwenden: 2012
Position vom Ende her gezählt -7 und dann 2 Stellen verwenden: 07
Position vom Ende her gezählt -10 und dann 2 Stellen verwenden: 17

Würde das Datum
Di 17.07.2012
geschrieben, würde das genauso funktionieren - deshalb die Zerlegung vom Ende her.

Wenn Du sicher bist, dass es den Wochentag vorneweg nicht gibt, kannst Du natürlich mit dem Zerlegen auch am Anfang beginnen:
%date:~6,4%%date:~3,2%%date:~0,2%
Du beachten: Der erste Wert ist ein Offset (wieviele Zeichen sollen übersprungen werden) - daher für den Tag 0 (könnte auch weggelassen und als %date:~,2% geschrieben werden) ...

BTW: Die (eigentlich gar nicht nötige Angabe) der 4 Stellen für die Jahreszahl funktioniert auch, wenn das Jahr nur zweistellig angegeben wäre - wenn aber auszuschließen ist, dass der Wochentag am Anfang des Datums steht, wäre
%date:~6%%date:~3,2%%date:~,2%
die kürzeste und (relativ) sicherste Schreibweise - noch genauer hat sich schon vor langer Zeit Tutorial der Thematik angenommen ...

Grüße
bastla
Member: ColdZero89
ColdZero89 Jul 19, 2012 updated at 12:14:41 (UTC)
Goto Top
Moin,

frage: Konnten wir dem Fragensteller denn nun helfen? face-big-smile

Ansonsten @bastla: Danke so erklärt sich mir das face-smile du bist ein schatz *fg*, hier nen Bier.

Und Bibers Tuto muss ich mir mal genauer Reinziehen wenn ich die Zeit dazu mal habe... sieht aber seeeeeeeeeeeeehr interessant aus :D

Gruß Zero
Member: pieh-ejdsch
pieh-ejdsch Jul 19, 2012 updated at 17:29:31 (UTC)
Goto Top
moin ColdZero,

für die Variablen gibts auch eins Variablen.

sonst sind auch noch paar andere .

Gruß Phil