自动执行文件夹备份任务(压缩、移动,然后根据命名约定重命名)

自动执行文件夹备份任务(压缩、移动,然后根据命名约定重命名)

我正在尝试自动备份 Windows 2003 R2 服务器上的文件夹(当前为手动过程)。

此任务包含三个部分:

1)在同一目录中生成以下文件夹的 zip 文件,无需使用第三方软件:

d:\source\folder_to_back_up

这给了我们:

d:\source\folder_to_back_up.zip

2)将新创建的 zip 文件移动到:

d:\destination

3)根据以下命名约定重命名 zip 文件:

Backup_YYYYMMDD.zip

例如,使用今天的日期,名称将是:

Backup_20150516.zip

到目前为止,我已经找到了如何自动执行步骤 2 的方法:

robocopy /mov d:\source d:\destination folder_to_back_up.zip

...但需要一些帮助来自动创建 zip 文件以及重命名步骤。

任何想法都将不胜感激!

答案1

由于您在另一个答案的评论中开始考虑 7-zip,因此我这样做了:

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
rem # a: Add, -mx: compression level 0-9, -tzip use ZIP format, -ssc: case sensitive, -ssw: add files opened for writing, -r: recursive
pushd "%SOURCE%" && 7za a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd

请注意,如果您内联源和目标变量,这本质上是一行代码。/对pushdpopd存在是为了在您在一个批次中执行多个备份时上下文不会发生变化。%date%是内置的。

我认为,在没有适当工具的情况下创建特殊文件格式 (zip) 是不合理的。这就像在没有 JDK 的情况下将 Java 源代码编译成 jar 一样。

依赖项

您可以通过将上述代码复制到backup_stuff.bat7za.exe文件旁边来解决删除该工具的问题backup_stuff.bat-7za.exe,然后只需替换7za%~dp0\backup_stuff.bat-7za以准确引用该文件即可。这应该传达出这里有一个外部依赖关系的信息……

或者,如果您真的想更加谨慎,只需将 7zip 嵌入到批处理文件中即可:)

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination

goto deps

:exec
pushd "%SOURCE%" && "%TEMP%\7za" a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
goto end

:deps
@(
rem This is the Base64 enconded version of 7za.exe
rem To create this section execute the following commands:
rem certutil -encode 7za.exe 7za.exe.b64
rem echo @echo off>7za.exe.b64.bat && for /F "tokens=*" %L in (7za.exe.b64) do @echo echo %L>>7za.exe.b64.bat

echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB9EXJSOXAcATlwHAE5cBwB
echo QmwQATtwHAG6bBIBIHAcAQ9WFgFbcBwBt3hDAThwHAE5cB0BlnAcAbp4QQE+cBwB

rem ... lot of lines ommitted for sake of stackoverflow

echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>%TEMP%\7za.exe.b64
certutil -decode -f %TEMP%\7za.exe.b64 %TEMP%\7za.exe >NUL

goto exec

:end

当我尝试使用原始 7-zip v9.20 exe 文件执行此操作时,我的 cmd 崩溃了。看起来块长度有限制(...),我发现它大约是 370kB(大约 5000 行 b64)。7-zip 的原始 base64 是 800kB,但这不是什么大问题,因为它可以分成多个@(...)>>target.file块,这些块都在限制之内。但我建议通过运行,upx --brute 7za.exe这样 exe 文件的大小就会小于 300kB。

来源

答案2

您可以从批处理文件创建 zip 文件。这可以使用 Microsoft Windows 中的 Shell.Application 软件代码来完成,也可以使用命令行来完成,但需要一些额外的代码。例如,Ansgar Wiechers 对 user2868186 问题的回答包含代码(靠近底部),看起来很可靠。作为替代方案,Rob Vanderwoude 在 VBS 上的页面还展示了一个解决方案。

您可能不喜欢需要 8-12 行(估计数量)VBScript 的想法。好吧,这是我发现的最好的自动化方法,同时依靠添加到 MS Windows 的最少代码。我不认为 MS Windows(至少不是您要求的版本)提供了一种使用更少代码来实现这一点的方法。

但是,如果您要定期添加该代码,那么您可能希望下载它,而不是多次输入。如果您要下载它,我建议您最好下载其他代码,例如 7-Zip 或 Info-Zip。7-Zip 可能需要更多时间才能学会如何从命令行使用它,但我成功使用它了。如果您不打算多次这样做,那么这可能是添加一次软件可能是长期解决方案的另一个原因(最少的时间投入,长期的回报)。我知道使用这样的软件并不是您所要求的,但我还是要提出这一点,因为我建议认真考虑这是否是最终的最佳解决方案。

关于第三步,将以下内容放入批处理文件中:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) echo %mydate% 请注意,显示的 FOR 命令旨在从批处理文件运行。尝试在批处理文件之外运行完全相同的命令也将不起作用。我在 Win7 SP1 中进行了测试。我没有 2003 R2 服务器可以进行测试,但我猜这种方法对您来说很有效。

我特此致谢杰伊回答罗里关于时间的问题作为此方法的基础。

相关内容