仅当响应为“一切正常”时才循环执行批处理文件

仅当响应为“一切正常”时才循环执行批处理文件

我有一个批处理文件,它循环遍历目录的内容并压缩目录中的文件,如下所示;

for %%a in (c:\data\*.*) do if "%%~xa" == "" "C:\Program Files\7-Zip\7za.exe" a -tzip -mx9 "%%a.zip" "%%a"

看到我正在使用 7zip 压缩文件,如果它成功压缩文件,它会返回消息“一切正常”,然后它会移动到下一个文件。

我想要做的事情如下;

  1. 仅当响应为“一切正常”时才转到下一个文件
  2. 如果响应不是“一切正常”,则会记录错误
  3. 由于发生错误,它尝试再次压缩文件
  4. 一旦成功,即“一切正常”,它就会转到下一个文件
  5. 步骤 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"

我觉得我没用过黑客:)

相关内容