zunaras
Goto Top

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:
@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

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

Content-Key: 324854

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

Printed on: April 23, 2024 at 21:04 o'clock

Mitglied: 130834
130834 Dec 25, 2016 updated at 21:21:32 (UTC)
Goto Top
Klar geht das. Hiermit:

FOR /F "delims=" %%A IN ('dir /b /ad "%DeinePfadVariable%"') do (  
:: deine Befehle
)

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
Mitglied: 77559
77559 Dec 25, 2016 updated at 22:21:21 (UTC)
Goto Top
Die einfachste Version ist dies :
@Echo off
Set Base="D:\Eigene Dateien\Bilder"  
Pushd %Base%
For /d %%A in (*) Do 7z.exe a "%%A.7z*" "%%A\*"  
popd
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 /f "delims=" %%A in (  
 'DIr /B /AD ????^|Findstr "20[0-9][0-9]"'   
   ) Do 7z.exe a "%%A.7z*" "%%A\*"  
popd
Member: Zunaras
Zunaras Dec 26, 2016, updated at Jan 07, 2017 at 20:25:57 (UTC)
Goto Top
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

@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
Member: Zunaras
Zunaras Jan 08, 2017 at 13:34:29 (UTC)
Goto Top
Moin!
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"  

Dann wird die gewünschte bat gestartet mit geändertem Anfang.

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%

Die Batch läuft auch zwei mal durch. Aber es wird immer nur Test2 übergeben.

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 . . .
Mitglied: 131381
131381 Jan 08, 2017 updated at 13:58:27 (UTC)
Goto Top
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!
)
Lese dazu bitte dieses Tutorial
Tutorial zur FOR-Schleife

Dann verstehst du den Unterschied zwischen dem Auflösen der Variablen zur Laufzeit und vor dem Ausführen.
Member: Zunaras
Zunaras Jan 09, 2017 at 10:49:40 (UTC)
Goto Top
Hallo und vielen Dank!

Das Tutorial habe ich bereits viele Tage nebenher geöffnet und versuch es zu verstehen....

Ein Problem habe ich jetzt mit dem Update-Switch-Command von 7z. Durch das "!" in -up0q3r2x2y2z0w2! wird ein Pfad angefügt.
Mitglied: 131381
Solution 131381 Jan 09, 2017 at 10:51:38 (UTC)
Goto Top
Dazu schalte DelayedExpansion vor dieser Zeile ab
setlocal disabledelayedexpansion