2017-02-02 62 views
0

我想在Win7上設置批量備份腳本。它主要工作,但我有一行代碼執行多次。我已經做了一些搜索,我認爲它與批處理文件如何在「()」中處理代碼有關,但我不確定解決該問題的最佳方法。Windows批處理腳本 - for/D分隔執行多次

任何幫助將會很棒!

腳本:如果

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" 
    ) 
    ) 
) 
) 
) 

線 「7z.exe」 多次執行 「%%我」 == 「%%〜ND」 是真實的。我的想法是,最後一個for循環來分割文件名被執行很多次,但一旦它得到%i並進行比較,我就完成了它。一旦「7z.exe」行執行後,我可以跳出循環嗎?我讀過在批處理文件中出現的問題很棘手。

讓我知道你是否需要細分代碼。

預先感謝您!

+0

確定'如果 「%%〜TF」 == 「%%〜TD」('的 - 也就是說,FILETIME比較備份目錄的時間?由於您在'c:\ zipdir'中創建文件,每次調用'7z'實例時它的時間都會改變。對我來說可能已經太遲了 - 但我沒有記住你正在嘗試做什麼。評論(請記住代碼塊中的REM註釋,而不是'::'註釋)可能會有很多解釋 - 並且可能有助於將來的維護。 – Magoo

+0

我們並不需要細分代碼,我們需要的是概述你試圖執行的任務以及與這些期望相關的事情。 – Compo

+0

謝謝你的回覆。我知道通常我不能那樣做比較。我只發佈了我遇到麻煩的那部分腳本。我正在運行FolderTimeUpdate b4,在臨時文件上運行這部分腳本。 FolderTimeUpdate掃描每個目錄中的所有文件,並將父文件夾的時間戳更新爲子目錄中最舊文件的時間戳。7-Zip也使用-stl開關將其時間戳設置爲最早的文件夾。只要沒有空文件夾,並且我手動清理了Zip文件,它就會工作。腳本仍然需要工作......但這是我目前卡住的地方。 –

回答

0

您還可以針對每個zip文件測試每個目錄。 與250個目錄和匹配的拉鍊相比,它們超過60000個。但這根本沒有必要。然後你不能對比文件夾的時間 - 它不會自行更新。因此,DIR的輸出並不合適。另外 - 現有的拉鍊保險絲已經有了,每次都會對這些保險絲進行比較。因此,對於一個文件夾的兩個備份,您的批處理將始終創建一個新的備份。 您的簡單循環搜索zip文件實際上沒有完成,因爲總是有新文件在創建問題後輸入到MFT和循環中。

我已經採用了robocopy來列出文件,因爲這個時間戳非常適合比較。 首先,只檢查文件夾並使用相應的zip文件。遞歸檢查文件夾的文件以及相應的zip文件。時間戳放置在一個列表中並進行排序。循環設置最後一個值,如果最後(即最新)文件來自zip文件夾,則不需要備份。 也會生成文件名的合適時間戳。

您可能需要調整路徑。

@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 

如果還沒有來自匹配文件夾的zip文件可用,當然,會創建一個zip文件。

一個完整的備份方案

+0

哇pieh-謝謝!另外,注意我腳本中的漏洞。我確實知道;我正在用另一個程序強制使用文件夾時間戳,並且只是根據需要手動刪除壓縮文件以防止您在討論的問題,如果有2個拉鍊。我已經計劃在解決此問題後進行攻擊。看起來你正在用「enabledelayedexpansion」來解決這個問題。我開始走下去,但沒有意識到你可以在一個if語句中設置它,然後我迷路了。我不熟悉腳本。我可能只是最終使用你的代碼...但我會先梳理它。 –