我正在尝试自动备份 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
请注意,如果您内联源和目标变量,这本质上是一行代码。/对pushd
的popd
存在是为了在您在一个批次中执行多个备份时上下文不会发生变化。%date%
是内置的。
我认为,在没有适当工具的情况下创建特殊文件格式 (zip) 是不合理的。这就像在没有 JDK 的情况下将 Java 源代码编译成 jar 一样。
依赖项
您可以通过将上述代码复制到backup_stuff.bat
该7za.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 服务器可以进行测试,但我猜这种方法对您来说很有效。
我特此致谢杰伊回答罗里关于时间的问题作为此方法的基础。