Backupscript soll automatisch die nächsten Unterordner finden und als Variable übergeben
Schönen guten Tag und frohe Weihnachten!
Ich habe einen Foto-Ordner mit Unterordner in Jahren unterteilt.
D:\Eigene Dateien\Bilder\2016
D:\Eigene Dateien\Bilder\2015
D:\Eigene Dateien\Bilder\2014
usw.
Eine Batch übernimmt die Sicherung der einzelnen Ordner. So dass ich pro Ordner-Jahr eine *.7z habe. Also - ich habe pro Jahr eine Batch, die ich manuell einzeln hintereinander ausführe.
Mir kam nun die Idee, ob es nicht ginge, nur den Ordner D:\Eigene Dateien\Bilder anzugeben, um damit automatisiert den Gesamten Pfad, wie oben beschrieben, meiner Batch als Variable zu übergeben. Also eine Schleife bis alle Unterordner abgearbeitet wurden.
Ist das möglich?
Hier mal der Anfang meiner Batch:
In Zeile 5 soll der gefundene Pfad aus der Schleife als Variable eingetragen werden:
set SF=%PfadausSchleife% (z.B: D:\Eigene Dateien\Bilder\2016)
Viele Grüße
Ich habe einen Foto-Ordner mit Unterordner in Jahren unterteilt.
D:\Eigene Dateien\Bilder\2016
D:\Eigene Dateien\Bilder\2015
D:\Eigene Dateien\Bilder\2014
usw.
Eine Batch übernimmt die Sicherung der einzelnen Ordner. So dass ich pro Ordner-Jahr eine *.7z habe. Also - ich habe pro Jahr eine Batch, die ich manuell einzeln hintereinander ausführe.
Mir kam nun die Idee, ob es nicht ginge, nur den Ordner D:\Eigene Dateien\Bilder anzugeben, um damit automatisiert den Gesamten Pfad, wie oben beschrieben, meiner Batch als Variable zu übergeben. Also eine Schleife bis alle Unterordner abgearbeitet wurden.
Ist das möglich?
Hier mal der Anfang meiner Batch:
@echo off
REM ---- Quell-Pfad bitte anpassen ----
REM -----------------------------------
set SF=D:\Eigene Dateien\Bilder\2016
echo Backup von: %SF%
REM ---- Backup-Pfad bitte anpassen ----
REM ------------------------------------
set BF=T:\Dateiversionsbackup
set SF=%PfadausSchleife% (z.B: D:\Eigene Dateien\Bilder\2016)
Viele Grüße
7 Antworten
- LÖSUNG clragon schreibt am 25.12.2016 um 22:07:15 Uhr
- LÖSUNG 77559 schreibt am 25.12.2016 um 23:19:18 Uhr
- LÖSUNG Zunaras schreibt am 26.12.2016 um 13:50:16 Uhr
- LÖSUNG Zunaras schreibt am 08.01.2017 um 14:34:29 Uhr
- LÖSUNG 131381 schreibt am 08.01.2017 um 14:53:13 Uhr
- LÖSUNG Zunaras schreibt am 09.01.2017 um 11:49:40 Uhr
- LÖSUNG 131381 schreibt am 09.01.2017 um 11:51:38 Uhr
- LÖSUNG Zunaras schreibt am 09.01.2017 um 11:49:40 Uhr
- LÖSUNG 131381 schreibt am 08.01.2017 um 14:53:13 Uhr
- LÖSUNG Zunaras schreibt am 08.01.2017 um 14:34:29 Uhr
- LÖSUNG Zunaras schreibt am 26.12.2016 um 13:50:16 Uhr
LÖSUNG 25.12.2016, aktualisiert um 22:21 Uhr
Klar geht das. Hiermit:
Der Schnipsel verarbeitet Jeden Ordner in "%DeinePfadVariable%"
Der Pfad des Ordners, also
D:\Eigene Dateien\Bilder\2016
D:\Eigene Dateien\Bilder\2015
D:\Eigene Dateien\Bilder\2014
ist dabei %%A.
Also musst du nur noch 7z a %%A --parameter --usw
eingeben.
Dir auch frohe Weihnachten
lg clragon
FOR /F "delims=" %%A IN ('dir /b /ad "%DeinePfadVariable%"') do (
:: deine Befehle
)
Der Pfad des Ordners, also
D:\Eigene Dateien\Bilder\2016
D:\Eigene Dateien\Bilder\2015
D:\Eigene Dateien\Bilder\2014
ist dabei %%A.
Also musst du nur noch 7z a %%A --parameter --usw
eingeben.
Dir auch frohe Weihnachten
lg clragon
LÖSUNG 25.12.2016, aktualisiert um 23:21 Uhr
Die einfachste Version ist dies :
Dabei ist zu beachten das hierbei keien Sortierung der Ordner erfolgt
(abgesehen von der auf ntfs-Laufwerken immanenten).
Eine genauere Selektion auf max vierstellige numerische Ordner mit 20 am Anfang:
@Echo off
Set Base="D:\Eigene Dateien\Bilder"
Pushd %Base%
For /d %%A in (*) Do 7z.exe a "%%A.7z*" "%%A\*"
popd
(abgesehen von der auf ntfs-Laufwerken immanenten).
Eine genauere Selektion auf max vierstellige numerische Ordner mit 20 am Anfang:
@Echo off
Set Base="D:\Eigene Dateien\Bilder"
Pushd %Base%
For /f "delims=" %%A in (
'DIr /B /AD ????^|Findstr "20[0-9][0-9]"'
) Do 7z.exe a "%%A.7z*" "%%A\*"
popd
LÖSUNG 26.12.2016, aktualisiert 07.01.2017
Hallo und vielen Dank!
eure Beispiele kann ich leider so nicht umsetzen. Ich gebe euch hier mal den gesamten Code, damit ihr einen besseren Überblick habt. Ich habe mir das alles mehr nach Try and Error zusammengebastelt als mit wirklichem Können.
Hier laufen einige Prüfungen durch und 7zip arbeitet mit Diff-Backups. Wenn das letzte Diff-Backup größer als 10% vom Voll-Backup ist, wird ein neues Voll-Backup erstellt.
Wenn möglich, müsste sich der Pfad in Zeile 5 nach jedem Durchlauf verändern, bis alle direkten Unterordner abgearbeitet wurden.
Viele Grüße
eure Beispiele kann ich leider so nicht umsetzen. Ich gebe euch hier mal den gesamten Code, damit ihr einen besseren Überblick habt. Ich habe mir das alles mehr nach Try and Error zusammengebastelt als mit wirklichem Können.
Hier laufen einige Prüfungen durch und 7zip arbeitet mit Diff-Backups. Wenn das letzte Diff-Backup größer als 10% vom Voll-Backup ist, wird ein neues Voll-Backup erstellt.
Wenn möglich, müsste sich der Pfad in Zeile 5 nach jedem Durchlauf verändern, bis alle direkten Unterordner abgearbeitet wurden.
Viele Grüße
@echo off
REM ---- Quell-Pfad bitte anpassen ----
REM -----------------------------------
set SF=D:\Eigene Dateien\Bilder\2016
echo Backup von: %SF%
REM ---- Backup-Pfad bitte anpassen ----
REM ------------------------------------
set BF=T:\Dateiversionsbackup
REM ---- Backup-Reservekopie-Pfad bitte anpassen für Robocopy ----
REM --------------------------------------------------------------
set RF=S:\Dateiversionsbackup-Kopie
REM ---- Max. Groesse vom Diff-Backup ----
REM ---- z.B. 100000000 = 100 MB ----
REM ---- Moeglich ist auch die Angabe von Prozentwert ----
REM ---- z.B. max. 10% der Groesse vom Vollbackup ----
REM ------------------------------------------------------
REM set GF=100000000
set Proz=10
set prog=C:\7z-Backup\7-Zip
REM set logpath=Logs ---- werden im Backup-Pfad gespeichert ----
REM Alternativ Pfad bauen
set SP=%SF:\\=NET\%
set SP=%SP::=%
REM ---- Freigabe der internen Bitlocker-Festplatte ----
REM ----------------------------------------------------
REM interne Sicherungsplatte
REM manage-bde -unlock T: -recoverypassword [Schlüssel]
REM timeout /t 5
REM ---- loeschen von Archiven und Logs, aelter als 100 Tage ----
REM -------------------------------------------------------------
C:\7z-Backup\DelAge\DelAge32 "%BF%\*.*" 100 /recurse /rd
md "%BF%\%SP%"
for /f "tokens=*" %%a in ('dir "%BF%\%SP%"\*Full.7z /b /od') do set last=%%a
for /f "tokens=*" %%a in ('dir "%BF%\%SP%"\*.7z /b /od') do set lastFile=%%a
for /f "tokens=*" %%a in ('dir "%BF%\%SP%"\*.7z /b /od') do set lastDiff=%%a
for /f %%a in ('powershell -Command "Get-Date -format yyyy.MM.dd_HH.mm.ss"') do set logtime=%%a
for /f %%a in ('powershell -Command "Get-Date -format HH.mm.ss"') do set start=%%a
if not exist "%BF%\%SP%\*Full.7z" goto FullBackup
forfiles /P "%BF%\%SP%" /M "%lastFull%" /D -30 >nul 2>&1 && goto FullBackup
if /i %lastfile:~-7% == Full.7z goto DiffBackup
if /i %lastDiff:~-7% == Diff.7z goto Pruefung
:Pruefung
Echo Pruefung der Dateigroesse vom letzten DiffBackup:
Echo.
for %%F in ("%BF%\%SP%\%lastDiff%") do set groesseDiff=%%~zF
for %%F in ("%BF%\%SP%\%last%") do set groesse=%%~zF
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(Replace(a(0),",",".")),a(1),,,0)>%R%
for /f %%i in ('cscript //nologo %R% "%groesse%/100*%Proz%" %Stellen%') do set Ergebnis=%%i
echo Groesse vom VollBackup %groesse%
echo Groesse 10Proz von Vollbackup %Ergebnis%
echo Groesse vom letzten DiffBackup %groesseDiff%
if %groesseDiff% GTR %Ergebnis% goto FullBackup
:DiffBackup
Echo Diff-Backup wird durchgefuehrt:
Echo.
echo Start: %start%>>"%BF%\%SP%\%logtime%_Diff.log"
"%prog%\7z.exe" u -ssw -mx1 -mmt=3 "%BF%\%SP%\%last%" -u- "%SF%" -up0q3r2x2y2z0w2!"%BF%\%SP%\%logtime%_Diff.7z" >>"%BF%\%SP%\%logtime%_Diff.log"
for /f %%a in ('powershell -Command "Get-Date -format HH.mm.ss"') do set ende=%%a
echo Ende: %ende%>>"%BF%\%SP%\%logtime%_Diff.log"
goto Weiter
:FullBackup
Echo Full-Backup wird durchgefuehrt:
Echo.
echo Start: %start%>>"%BF%\%SP%\%logtime%_Full.log"
"%prog%\7z.exe" a -ssw -mx1 -mmt=3 "%BF%\%SP%\%logtime%_Full.7z" "%SF%" >>"%BF%\%SP%\%logtime%_Full.log"
for /f %%a in ('powershell -Command "Get-Date -format HH.mm.ss"') do set ende=%%a
echo Ende: %ende%>>"%BF%\%SP%\%logtime%_Full.log"
REM -bd (Disable percentage indicator)
REM -ssw (auch geoeffnete Dateien)
REM -mx3 (0=Copy, 1=Fastest (mp3, jpg, Videos), 3=Fast, 5=normal, 7=Maximum, 9=Ultra)
REM -spf (komplette Pfadangaben, hier nicht nutzbar)
REM -mmt=3 (Anzahl der CPU-Kerne, hier 3)
REM @include.txt
REM -xr@exclude.txt
:Weiter
REM ---- Freigabe einer der Bitlocker-Wechsel-Festplatten ----
REM ----------------------------------------------------------
REM Sicherung_1
manage-bde -unlock S: -recoverypassword [Schlüssel]
REM Sicherung_2
manage-bde -unlock S: -recoverypassword [Schlüssel]
REM timeout /t 5
Echo Dateiversionsbackup-Reservekopie wird auf das Wechsellaufwerk gespiegelt:
Echo.
for /f %%a in ('powershell -Command "Get-Date -format yyyy.MM.dd_HH.mm.ss"') do set Robocopy=%%a
md "%RF%\%SP%"
robocopy.exe "%BF%\%SP%" "%RF%\%SP%" /MIR /XJ /R:0 /W:0 /TEE /MT:1 /Log+:"%BF%\%SP%\%Robocopy%_Robocopy.log"
if exist "%BF%\%SP%" start explorer.exe "%BF%\%SP%"
if exist "%RF%\%SP%" start explorer.exe "%RF%\%SP%"
REM pause
REM manage-bde -lock S:
REM manage-bde -lock F:
REM "%prog%\USB_Disk_Eject.exe" /REMOVELABEL "USB-DAHO"
REM exit
LÖSUNG 08.01.2017 um 14:34 Uhr
Moin!
ich habe noch mal probiert:
In c:\pflege befinden sich die Ordner Test1 und Test2
in Start.bat
Dann wird die gewünschte bat gestartet mit geändertem Anfang.
Die Batch läuft auch zwei mal durch. Aber es wird immer nur Test2 übergeben.
ich habe noch mal probiert:
In c:\pflege befinden sich die Ordner Test1 und Test2
in Start.bat
set SF1=c:\pflege
FOR /F "delims=" %%A IN ('dir /b /ad "%SF1%"') do call "C:\7z-Backup\Backup7z (Bilder Unterordner).bat"
REM ---- Quell-Pfad bitte anpassen ----
REM -----------------------------------
rem set SF1=c:\pflege
FOR /F "delims=" %%A IN ('dir /b /ad "%SF1%"') do set SF2=%%A
set SF3=%SF1%\%SF2%
echo Backup von: %SF3%
C:\7z-Backup>set SF1=c:\pflege
C:\7z-Backup>FOR /F "delims=" %A IN ('dir /b /ad "c:\pflege"') do call "C:\7z-Backup\Backup7z (Bilder Unterordner).bat"
C:\7z-Backup>call "C:\7z-Backup\Backup7z (Bilder Unterordner).bat"
C:\7z-Backup>rem @echo off
C:\7z-Backup>REM ---- Quell-Pfad bitte anpassen ----
C:\7z-Backup>REM -----------------------------------
C:\7z-Backup>rem set SF1=c:\pflege
C:\7z-Backup>FOR /F "delims=" %A IN ('dir /b /ad "c:\pflege"') do set SF2=%A
C:\7z-Backup>set SF2=Test1
C:\7z-Backup>set SF2=Test2
C:\7z-Backup>set SF3=c:\pflege\Test2
C:\7z-Backup>echo Backup von: c:\pflege\Test2
Backup von: c:\pflege\Test2
C:\7z-Backup>pause
Drücken Sie eine beliebige Taste . . .
LÖSUNG 08.01.2017, aktualisiert um 14:58 Uhr
Die Batch läuft auch zwei mal durch. Aber es wird immer nur Test2 übergeben.
Das ist klar weil wenn du mit SET innerhalb einer FOR-Schleife eine Variable definierst diese entweder nur mit call set oder delayedexpansion und Ausrufezeichen beim Abrufen der Variablen zur Laufzeit aufgelöst werden!
setlocal ENABLEDELAYEDEXPANSION
set "SF1=c:\pflege"
FOR /F "delims=" %%A IN ('dir /b /ad "%SF1%"') do (
set "SF3=%SF1%\%%A"
echo Backup von: !SF3!
)
https://www.administrator.de/wissen/tutorial-for-schleife-155681.html
Dann verstehst du den Unterschied zwischen dem Auflösen der Variablen zur Laufzeit und vor dem Ausführen.
LÖSUNG 09.01.2017 um 11:49 Uhr
LÖSUNG 09.01.2017 um 11:51 Uhr