2017-02-02 45 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语句中设置它,然后我迷路了。我不熟悉脚本。我可能只是最终使用你的代码...但我会先梳理它。 –