我正在尝试在Win7上设置批量备份脚本。它主要是工作,但我有一行代码执行多次。我已经做了一些搜索,我认为它与批处理文件处理代码的方式有关"()"但我不确定解决问题的最佳方法。
任何帮助都会很棒!
脚本:
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"如果" %% i" ==" %% ~nd"是真的。我的想法是,最后一次循环分割文件名正在执行多次,但一旦得到%i并进行比较,我就完成了它。我可以在" 7z.exe"之后突破循环。行被执行?我已经读过在批处理文件中爆发是很棘手的。
如果您需要细分代码,请告诉我。
提前谢谢!
答案 0 :(得分:0)
您还可以针对每个zip文件测试每个目录。 这些超过60000与250个目录和匹配的拉链相比。但这根本不是必需的。然后你不能反对文件夹比较的时间 - 它不会更新自己。因此,DIR的输出完全不合适。 此外 - 已有的现有拉链式保险丝,每次都会对这些保险丝进行比较。因此,对于文件夹的两个备份,您的批处理将始终进行新备份。 您搜索zip文件的简单循环几乎没有完成,因为在创建问题之后,始终在MFT中输入新文件并循环播放。
我已经使用robocopy列出文件,因为这个时间戳非常适合比较。 首先,只检查文件夹并使用相应的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。