У меня есть пакетный файл, который просматривает содержимое каталога и сжимает файлы в каталоге следующим образом;

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 раз, прежде чем они сдаются и переходят к следующему файлу.

Как мне этого добиться?

2 ответа2

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

1

Расширение ответа 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")

... и я не думаю, что я использовал какие-либо хаки :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .