备份脚本-按模式查找文件,读取其全名并传递给脚本

时间:2018-12-24 14:31:53

标签: windows cmd scripting backup

我正尝试使用 7-Zip 进行备份。
我已经写了完整备份的脚本:

@echo off
set source="c:\Source"
set destination="C:\Dest"
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%dd%-%mm%-%yyyy%
"C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx6 -r0 %destination%\Full_%curdate%.zip %source%

完成完全备份后,将启动用于增量备份的新脚本。但是我真的不知道如何使我的第二个脚本从目录中读取文件并查找像full_xx_xx_xxxx.zip一样的文件,然后将其文件名分配给变量,然后将其传递给脚本以进行增量备份。

我在下面尝试了脚本,但是它不起作用:

@echo off
set source="c:\Source"
set destination="c:\Dest"
set exten="Full_*.zip"
set passwd="NAS"
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%dd%-%mm%-%yyyy%
for %%a in %exten do echo %%a
"C:\Program Files\7-Zip\7z.exe" u -tzip -ssw -r0 %destination%\%%a.zip -u- -up0q3x2z0!"%destination%\diff_%date%.zip" %source%

1 个答案:

答案 0 :(得分:0)

两个脚本中都有多个错误。

我建议先阅读How to set environment variables with spaces?Why is no string output with 'echo %var%' after using 'set var = text' on command line?。语法set variable="value in quotes"通常不是很好,因为它用双引号和可能也存在于批处理文件中的所有尾随空格/制表符将字符串"value in quotes"分配给环境变量,并且使用以下字符:名称variable。这种语法在将环境变量的字符串值与其他字符串连接(如在已发布的代码中使用%destination%进行连接)时存在问题,因为"现在位于最终参数字符串的中间,而不是将整个字符串括起来参数字符串。更好的做法是将变量名称保留在set "variable=value without or with spaces"的语法"处,因为双引号现在被解释为参数字符串分隔符,并且可能在第二个"之后忽略了行中的现有空格/制表符命令处理器。

使用动态环境变量DATE使得可以使用可用于文件/文件夹名称的格式快速获取当前的区域设置日期。但是必须考虑到DATE的日期格式取决于为运行批处理文件使用的用户帐户设置的区域/国家/地区。我想echo %DATE%会以DD.MM.YYYY格式输出日期,因此根据配置的国家/地区,使用DATE的命令行对于您的用户帐户是正确的。

FOR 命令行完全错误,导致退出批处理文件执行,并且cmd.exe输出的错误消息逐行解释批处理文件。从命令提示符窗口运行批处理文件时可以看到此错误输出,而不是双击批处理文件。有关如何调试批处理文件以查找批处理文件执行期间Windows命令处理器报告的语法错误的详细信息,请参见debugging a batch file

所以我建议使用第一个批处理文件:

@echo off
set "Source=C:\Source"
set "Destination=C:\Dest"
set "CurrentDate=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%"
"%ProgramFiles%\7-Zip\7z.exe" a -tzip -ssw -mx6 -r0 "%Destination%\Full_%CurrentDate%.zip" "%Source%"

当前语言环境日期以CurrentDate而不是YYYY-MM-DD的格式分配给环境变量DD-MM-YYYY。日期格式YYYY-MM-DD是根据ISO 8601的国际日期格式。与文件名中的所有locale date formats相比,它具有一个很大的优势:日期为YYYY-MM-DD的文件名按字母顺序排序像往常一样是同时按时间顺序排序的。这样一来,人们和脚本就可以更轻松地在文件名列表中找到日期为文件名的特定文件。

我不确定您要对第二个批处理文件做什么。所以我只能假设您要做什么,并建议第二个批处理文件:

@echo off
set "Source=C:\Source"
set "Destination=C:\Dest"
set "CurrentDate=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%"
set "NamePattern=Full_*.zip"
for /F "skip=1 eol=| delims=" %%I in ('dir "%Destination%\%NamePattern%" /A-D /B /O-N 2^>nul') do (
    "%ProgramFiles%\7-Zip\7z.exe" u -tzip -ssw -r0 "%Destination%\%%I" -u- -up0q3x2z0!"%Destination%\Diff_%CurrentDate%.zip" "%Source%"
    goto Done
)
:Done

FOR 循环在后台启动的单独命令进程中运行命令 DIR ,以获取目标目录中Full_*.zip个文件名的列表,该列表按名称反向排序这意味着将使用日期格式YYYY-MM-DD将今天之前创建的完整备份ZIP文件排在最前面,日期格式为@echo off setlocal EnableExtensions DisableDelayedExpansion set "Source=C:\Source" set "Destination=C:\Dest" set "CurrentDate=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%" set "NamePattern=Full_*.zip" rem Create full ZIP backup. "%ProgramFiles%\7-Zip\7z.exe" a -tzip -ssw -mx6 -r0 "%Destination%\Full_%CurrentDate%.zip" "%Source%" rem Create difference ZIP backup with files added/changed in source directory rem in comparison to the files compressed into last but on full ZIP backup. for /F "skip=1 eol=| delims=" %%I in ('dir "%Destination%\%NamePattern%" /A-D /B /O-N 2^>nul') do ( "%ProgramFiles%\7-Zip\7z.exe" u -tzip -ssw -r0 "%Destination%\%%I" -u- -up0q3x2z0!"%Destination%\Diff_%CurrentDate%.zip" "%Source%" goto Done ) :Done endlocal ,而昨天(或创建了最后一个完整ZIP文件时)将使用昨天创建的完整备份ZIP文件。第二行。

FOR 跳过具有当前日期的ZIP文件名的第一行,并使用先前创建的ZIP文件(昨天)运行 7-Zip 以创建差异ZIP文件。然后退出 FOR 循环,而不处理所有其他完整的ZIP文件,只需跳到 FOR 循环下方的标签即可。

两个批处理文件在一起:

dir /?

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • rem /?
  • set /?
  • setlocal /?
  • request.Headers["X-My-Custom-Header"] = "the-value";