Windows批处理脚本 - for / D delims执行多次

时间:2017-02-02 16:43:43

标签: windows batch-file for-loop break

我正在尝试在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"之后突破循环。行被执行?我已经读过在批处理文件中爆发是很棘手的。

如果您需要细分代码,请告诉我。

提前谢谢!

1 个答案:

答案 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。

完整的备份程序