我有一个批处理文件,它循环遍历目录的内容并压缩目录中的文件,如下所示;
for %%a in (c:\data\*.*) do if "%%~xa" == "" "C:\Program Files\7-Zip\7za.exe" a -tzip -mx9 "%%a.zip" "%%a"
看到我正在使用 7zip 压缩文件,如果它成功压缩文件,它会返回消息“一切正常”,然后它会移动到下一个文件。
我想要做的事情如下;
- 仅当响应为“一切正常”时才转到下一个文件
- 如果响应不是“一切正常”,则会记录错误
- 由于发生错误,它尝试再次压缩文件
- 一旦成功,即“一切正常”,它就会转到下一个文件
- 步骤 3 和 4 最多只发生 3 次,之后它放弃并转到下一个文件。
我怎样才能实现这个目标?
答案1
(1)和(2)
if
您可以使用标签、和的组合返回代码:for %%a in (…) do if … "7za.exe" … "%%a" & if not %errorlevel%==0 (set z_file="%%a" & goto error) … :error echo Something was borked for "%z_file%"! >> Compress.log
(3)
您可以从错误例程中调用压缩行:
:error echo Error… 7z…
(4)和(5)
现在情况变得复杂了,超出了批处理文件的限制。它是可能,但需要高级函数和技巧。您可以将压缩和错误例程放在子例程中,并根据需要调用它们。您还可以使用
set
来制作计数器(例如set /a counter=counter+1
)(这是启用命令扩展的一个原因)和if
逻辑(例如if %counter% leq 3 call :compress
)
答案2
扩展 Synetech 的答案 – 这是一个工作脚本:
@echo off
SETLOCAL ENABLEEXTENSIONS
set max_try=3
for %%I in (c:\data\*.*) do if "%%~xI" == "" (
set cnt_try=0
call :7zip "%%~I"
)
exit /B %ERL%
:7zip
set /A cnt_try+=1
"C:\Program Files\7-Zip\7za.exe" a -tzip -mx9 "%~1.zip" "%~1"
set ERL=%ERRORLEVEL%
if %ERL% NEQ 0 if %cnt_try% LEQ %max_try% (goto :7zip) else (
echo Something was borked for "%~1"^! ^(%ERL%^) >> Compress.log
)
exit /B %ERL%
在稍微不同的条件下,它对我来说工作正常(例如if "%%~xI" == ".txt"
)
我觉得我没用过黑客:)