2017-02-02 6 views
0

Ich versuche, ein Batch-Backup-Skript auf Win7 einzurichten. Es funktioniert meistens, aber ich habe eine Codezeile, die mehrmals ausgeführt wird. Ich habe etwas herumgesucht und ich denke, dass es damit zu tun hat, wie Batch-Dateien Code in "()" verarbeiten, aber ich bin mir nicht sicher, der beste Weg, um es zu beheben.Windows Stapelscript- for/D Delims Ausführen mehrmals

Jede Hilfe wäre toll!

Script:

for /D %%d in (C:\toBackupDir\*.*) do (
for %%f in (C:\zipDir\*) do (
    for /f "tokens=1 delims=_" %%i in ("%%~nf") do (
    if "%%i"=="%%~nd" (
    if "%%~tf"=="%%~td" (
     echo "%%~nf" is "%%~nd" No Backup necessary. 
    ) else (
     7z.exe a -tzip -stl -mx=1  "C:\zipDir\%%~nd_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.zip" "%%d" 
    ) 
    ) 
) 
) 
) 

Die Zeile "7z.exe" wird oft, wenn "%% i" == "%% ~ nd" ausgeführt ist wahr. Mein Gedanke ist, dass die letzte for-Schleife zum Teilen des Dateinamens viele Male ausgeführt wird, aber sobald sie% i bekommt und die Vergleiche macht, bin ich damit fertig. Kann ich nach Ausführung der Zeile "7z.exe" aus der Schleife ausbrechen? Ich habe gelesen, dass das Ausbrechen in einer Batch-Datei schwierig ist.

Lassen Sie mich wissen, wenn Sie eine Aufschlüsselung des Codes benötigen.

Vielen Dank im Voraus!

+0

Sind Sie sicher, dass der 'if "%% ~ tf" == "%% ~ td"(' - das heißt, die filetime zu der Zeit Backup-Verzeichnis zu vergleichen? Da Sie Dateien in 'c: \ zipdir' erstellen, ändert sich die Zeit jedes Mal, wenn eine' 7z' Instanz aufgerufen wird. Vielleicht ist es zu spät für mich - aber ich verliere den Überblick über das, was Sie versuchen zu tun Kommentare (erinnern Sie sich an "REM" Kommentare in Codeblöcken, nicht '' '' Kommentare) kann viel erklären - und würde wahrscheinlich mit der zukünftigen Wartung helfen. – Magoo

+0

Wir brauchen nicht wirklich eine Aufschlüsselung des Codes, was wir brauchen, ist eine Übersicht der Aufgabe, die Sie zu erfüllen versuchen und was in Bezug auf diese Erwartungen geschieht. – Compo

+0

Vielen Dank für Ihre Antwort. Ich weiß, dass ich das normalerweise nicht vergleichen kann. Ich habe nur den Teil des Skripts gepostet, mit dem ich Probleme hatte. Ich führe FolderTimeUpdate b4 aus, das diesen Teil des Skripts auf temporären Dateien ausführt. FolderTimeUpdate überprüft alle Dateien in jedem Verzeichnis und aktualisiert den Zeitstempel des übergeordneten Ordners auf den Wert der ältesten Datei in einem untergeordneten Verzeichnis.7-Zip legt auch seinen Zeitstempel auf den ältesten Ordner mit der Option -stl fest. Dies funktioniert, solange es keine leeren Ordner gibt und wenn ich Zips manuell lösche. Das Skript braucht noch Arbeit ... aber hier bin ich momentan festgefahren. –

Antwort

0

Sie testen auch jedes Verzeichnis gegen jede Zip-Datei. Dies sind mehr als 60000 vergleicht mit 250 Verzeichnisse und die passenden Reißverschlüsse. Aber das ist überhaupt nicht notwendig. Dann kannst du nicht gegen die Zeit des Ordners Vergleichen - es aktualisiert sich nicht. Die Ausgabe von dem DIR ist daher überhaupt nicht geeignet. Dazu kommt - was schon bei den vorhandenen Reissicherungen ist, diese werden auch jedesmal mit verglichen. Bei zwei Sicherungen eines Ordners würde Ihr Stapel daher immer eine neue Sicherung erstellen. Ihre einfache Schleife, die nach den ZIP-Files sucht, ist praktisch nicht fertig, weil nach der Erstellung immer neue Dateien in die MFT und die Schleife eingetragen werden.

Ich habe Robocopy genommen, um die Dateien aufzulisten, weil dieser Zeitstempel sehr gut zum Vergleich geeignet ist. Zuerst wird nur der Ordner und damit die entsprechende Zip-Datei überprüft. Der Ordner wird rekursiv für die Dateien sowie die entsprechende ZIP-Datei überprüft. Die Zeitstempel werden in einer Liste platziert und sortiert. Die Schleife legt den letzten Wert fest, wenn die letzte (dh die neueste) Datei aus dem Ordner der Zips kommt, braucht keine Sicherung. Ein geeigneter Zeitstempel für den Dateinamen wird ebenfalls generiert.

Möglicherweise müssen Sie die Pfade anpassen.

@echo off 
setlocal 
set "Folder=d:\toBackup" 
set "Backup=d:\zipdir" 
call :TAB 
set "TS=." 
for /d %%F in ("D:\files\*")do (
    set "TsFn=" 
    set "tozip=" 
    for /f "tokens=2,3delims=%TAB%" %%A in (' 
    (robocopy /L "%backup%" ".. only listing ..\\" "%%~nF_*.zip" /njh /fp /ts /ns /nc /ndl /njs^
    ^& robocopy /L /e "%%F" ".. List only ..\\" /njh /fp /ts /ns /nc /ndl /njs ^)^|sort 
    ')do ( 
    set "TsFn=%%A*%%~dpB" 
    if /i "%%~dpB"=="%Backup%\" (set "tozip=" 
    )else set "tozip=1" 
) 
    if defined tozip call :timestamp 
    if defined TsFn (
    setlocal enabledelayedexpansion 
    for /f "tokens=1-3delims=*" %%S in ("!TS!*!TsFn!")do (
     endlocal 
     if NOT defined tozip (echo %%T %%~nxF - No Backup necessary. 
    )else echo 7z.exe a -tzip -stl -mx=1 "%Backup%\%%~nF_%%S.zip" "%%F" 
    ) 
) 
) 
pause 
exit /b 

:TAB 
for /f "delims= " %%T in ('robocopy /L . . /njh /njs') do set "TAB=%%T" 
rem END TAB 
exit /b 

:Timestamp 
rem robocopy /L "\.. Timestamp ..\\" . 
for /f "eol=D tokens=1-6 delims=/: " %%T in (' robocopy /L /njh "\|" .^|find "123" ') do (
    set "TS=%%T%%U%%V-%%W%%X%%Y" 
    set "TSDATE=%%T%%U%%V" 
    set /a YY=%%T , MM=100%%U %%100 , TT=100%%V %%100 
) 
rem END Timestamp 
exit /b 

Wenn noch keine Zip-Datei aus dem passenden Ordner vorhanden ist, wird natürlich eine Zip erstellt.

Ein komplettes Backup-Programm

+0

Wow pie- Danke! Auch, um die Löcher in meinem Skript zu notieren. Ich war mir eigentlich bewusst; Ich erzwang den Zeitstempel des Ordners mit einem anderen Programm und entfernte nur manuell die Zips nach Bedarf, um das Problem zu vermeiden, über das Sie sprachen, wenn es zwei Reißverschlüsse gab. Ich hatte vor, das anzugreifen, nachdem ich dieses Problem gelöst hatte. Es sieht so aus, als ob du das mit "enabledelayedexpansion" löst. Ich bin diesen Weg gegangen, habe aber nicht gemerkt, dass du es einfach in eine if-Anweisung setzen kannst, und dann bin ich verloren gegangen. Ich bin neu im Scripting. Ich werde wahrscheinlich nur am Ende Ihren Code verwenden ... aber ich werde es zuerst durchkämmen. –

Verwandte Themen