aschnack1
Goto Top

Batch Automatische Auswahl von erstelltem Ordner, nur wie?

Hallo zusammen,

Ich hänge grade an einer Batch fest und hoffe das ihr mir in meiner denk-Blockade helfen könnt:
Ausgangssituation:
Ein Programm erzeugt eine Backup-File. Da eine Automatische Einordnung nicht möglich ist, will ich die per Batch machen. Diese Einordnung soll folgender Regel folgen. Es gibt 4 unter-Ordner, für jede Woche einen. Beim start des skripts wird zunächst der Ordner mit dem alter von über 28 Tagen gelöscht, anschließend dieser neu erzeugt. Anschließend soll die Datei in den grade neu erstellten Ornder verschoben werden. und da hänge ich jetzt, ich weis nicht wie dem Copy-Befehl sage, das es den grade erzeugten Ordner als Ziel wählen soll.

mkdir C:\Users\Bla\Desktop\TEMP
robocopy.exe C:\Users\Bla\Desktop\abc\*.* C:\Users\Bla\Desktop\TEMP /E /MOVE /MINAGE:28 /R:1 /W:1 /MT
rmdir C:\Users\Bla\Desktop\TEMP
if exist C:\Users\Bla\Desktop\abc\1  (
	goto Prüfung Woche2
)	Else
	mkdir C:\Users\Bla\Desktop\abc\1
	goto Kopieren
)
:Prüfung Woche2
if exist C:\Users\Bla\Desktop\abc\2  (
	goto Prüfung Woche3
)	Else
	mkdir C:\Users\Bla\Desktop\abc\2
	goto Kopieren
)
:Prüfung Woche3
if exist C:\Users\Bla\Desktop\abc\3  (
	goto Prüfung Woche4
)	Else
	mkdir C:\Users\Bla\Desktop\abc\3
	goto Kopieren
)
:Prüfung Woche4
if exist C:\Users\Bla\Desktop\abc\4  (
	goto Kopieren
)	Else
	mkdir C:\Users\Bla\Desktop\abc\4
	goto Kopieren
)
:Kopieren
%ZIEL%=XXXXXXXXXXXXXXXXXXXXXXX
robocopy.exe C:\Users\Bla\Desktop\Twingo %ZIEL% /MT /R:1 /W:1 

pause

Content-Key: 392320

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

Printed on: April 25, 2024 at 15:04 o'clock

Member: FireWALL
Solution FireWALL Nov 11, 2018 updated at 09:39:28 (UTC)
Goto Top
Moin.

An deiner Stelle würde ich es mir etwas einfacher machen: Soweit ich es verstehe, läuft dein Backup immer in den gleichen Ordner.
Von hier aus würde ich dann vier Copy-Jobs laufen lassen (jeden dabei nur jede vierte Woche, der Start der Jobs muss also um je eine Woche versetzt werden), welche direkt die Quelle in das Ziel spiegeln.
Damit hättest du eine feste Einplanung: In Woche 1 wird in "abc\1" gesichert, in Woche 2 startet der Copy-Job nach "abc\2" etc...

Grüße
Member: Pedant
Solution Pedant Nov 11, 2018 updated at 17:39:47 (UTC)
Goto Top
Hallo Aschnack1,

die simple Vorgehensweise, die FireWALL vorschlug ist vielleicht vorzuziehen, dennoch möchte ich Deine Frage beantworten.

Verwende "Kopieren" nicht als einfaches Sprungziel, sondern als Funktion.
Das geht indem Du statt goto Sprungziel zu verwenden call :Sprungziel Parameter verwendest.
(Den Doppelpunkt vor "Sprungziel" nicht vergessen)
So kannst Du dem Sprungziel (der Funktionen) den gewünschten Wert mitgeben.
Den Hauptcode musst Du zusätzlich mit exit /b oder goto :eof terminieren und Funktion(en) danach deklarieren.
Es muss dann call verwendet werden, was dazu führt, dass nach dem Funktionsaufruf die Ausführung zurückkehrt und mit der nächsten Zeile im Hauptcode weitermacht, was aber hier nicht gewünscht ist.
Um das Weitermachen zu verhindern (abzuwürgen) kannst Du ein goto fertig einsetzen.

Hier der ungestestete Code dazu:
mkdir C:\Users\Bla\Desktop\TEMP
robocopy.exe C:\Users\Bla\Desktop\abc\*.* C:\Users\Bla\Desktop\TEMP /E /MOVE /MINAGE:28 /R:1 /W:1 /MT
rmdir C:\Users\Bla\Desktop\TEMP
if exist C:\Users\Bla\Desktop\abc\1  (
	goto Prüfung Woche2
)	Else
	mkdir C:\Users\Bla\Desktop\abc\1
	call :Kopieren C:\Users\Bla\Desktop\abc\1
	goto fertig
)
:Prüfung Woche2
if exist C:\Users\Bla\Desktop\abc\2  (
	goto Prüfung Woche3
)	Else
	mkdir C:\Users\Bla\Desktop\abc\2
	call :Kopieren C:\Users\Bla\Desktop\abc\2
	goto fertig
)
:Prüfung Woche3
if exist C:\Users\Bla\Desktop\abc\3  (
	goto Prüfung Woche4
)	Else
	mkdir C:\Users\Bla\Desktop\abc\3
	call :Kopieren C:\Users\Bla\Desktop\abc\3
	goto fertig
)
:Prüfung Woche4
if exist C:\Users\Bla\Desktop\abc\4  (
	call :Kopieren C:\Users\Bla\Desktop\abc\4
	goto fertig
)	Else
	mkdir C:\Users\Bla\Desktop\abc\4
	call :Kopieren C:\Users\Bla\Desktop\abc\4
	goto fertig
)

:fertig
pause
exit /b
REM hier endet der Hauptcode


REM beginnt die aufzurufende Funktion
REM %1 beinhaltet den ersten übergebenen Parameter
:Kopieren
%ZIEL%=%1
robocopy.exe C:\Users\Bla\Desktop\Twingo %ZIEL% /MT /R:1 /W:1

Alternativ kannst Du Deinen Code im Prinzip belassen wie er ist, aber die Variable %ZIEL% schon in den Fallunterscheidungen belegen.
Das erscheint mir hier die einfachere und bessere Lösung zu sein, als die Verwendung einer Funktion.

Das könnte ungetestet so aussehen:
mkdir C:\Users\Bla\Desktop\TEMP
robocopy.exe C:\Users\Bla\Desktop\abc\*.* C:\Users\Bla\Desktop\TEMP /E /MOVE /MINAGE:28 /R:1 /W:1 /MT
rmdir C:\Users\Bla\Desktop\TEMP
if exist C:\Users\Bla\Desktop\abc\1  (
	goto Prüfung Woche2
)	Else
	mkdir C:\Users\Bla\Desktop\abc\1
	set ZIEL=C:\Users\Bla\Desktop\abc\1
	goto Kopieren
)
:Prüfung Woche2
if exist C:\Users\Bla\Desktop\abc\2  (
	goto Prüfung Woche3
)	Else
	mkdir C:\Users\Bla\Desktop\abc\2
	set ZIEL=C:\Users\Bla\Desktop\abc\2
	goto Kopieren
)
:Prüfung Woche3
if exist C:\Users\Bla\Desktop\abc\3  (
	goto Prüfung Woche4
)	Else
	mkdir C:\Users\Bla\Desktop\abc\3
	set ZIEL=C:\Users\Bla\Desktop\abc\3
	goto Kopieren
)
:Prüfung Woche4
if exist C:\Users\Bla\Desktop\abc\4  (
	set ZIEL=C:\Users\Bla\Desktop\abc\4
	goto Kopieren
)	Else
	mkdir C:\Users\Bla\Desktop\abc\4
	set ZIEL=C:\Users\Bla\Desktop\abc\4
	goto Kopieren
)

:Kopieren
robocopy.exe C:\Users\Bla\Desktop\Twingo %ZIEL% /MT /R:1 /W:1 

pause


Noch ein allgemeiner Tipp:
Verwende generell keine Leerzeichen in den Bezeichnern der Sprungziele, denn sonst sind Bezeichner und Parameter schlecht auseinanderzuhalten.

Schlecht:
@echo off
call :Sprungziel Parameter
goto Sprungziel Parameter
echo Dieser Text wird nie gezeigt

:Sprungziel Parameter
echo Sprungziel Parameter

exit /b

:Sprungziel
echo Sprungziel %1

Besser:
@echo off
call :Sprungziel Parameter
goto Sprungziel_Parameter
echo Dieser Text wird nie gezeigt

:Sprungziel_Parameter
echo Sprungziel_Parameter

exit /b

:Sprungziel
echo Sprungziel %1
Gruß Frank
Member: Aschnack1
Aschnack1 Nov 12, 2018 updated at 08:20:09 (UTC)
Goto Top
Vielen Dank für eure Lösungen, ich habe es jetzt erstmal wie @pendant vorgeschlagen, mit der Festlegung der %ZIEL% Variablen in der Wochen abfrage, gemacht. Ich hatte einfach die da die Denkblockade, ich finde ein Skript jede Woche laufen zu lassen einfach besser als 4 verschiedene Skripts zu haben und zu Prüfen im Fehlerfall.