Fazendo um loop através de um arquivo de lote somente se a resposta for "tudo está bem"

0

Eu tenho um arquivo em lotes que percorre o conteúdo de um diretório e compacta os arquivos no diretório da seguinte forma:

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

Vendo que estou usando o 7zip para compactar o arquivo, ele retorna a mensagem "está tudo ok" se tiver compactado o arquivo com êxito e, em seguida, passar para o próximo arquivo em qualquer um.

O que eu gostaria de fazer é o seguinte:

  1. Somente mova para o próximo arquivo se a resposta for "tudo está bem"
  2. Se a resposta não for "tudo está bem", o erro será registrado
  3. Como ocorreu um erro, ele tenta compactar o arquivo novamente
  4. Uma vez que foi bem-sucedido, ou seja, "está tudo bem", vai para o próximo arquivo
  5. Etapas 3 e amp; 4 só ocorre no máximo 3 vezes antes de desistir e passar para o próximo arquivo.

Como posso conseguir isso?

    
por PeanutsMonkey 30.08.2012 / 05:12

2 respostas

1
  • (1) e (2)

    Você pode usar uma combinação de marcadores, if e códigos de retorno :

    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)

    Você pode chamar a linha de compactação da rotina de erros:

    :error
      echo Error…
      7z…
    
  • (4) e (5)

    Agora você está ficando complicado e além das limitações de um arquivo em lote. É possível , mas requer funções avançadas e hacks. Você pode colocar as rotinas de compressão e erro nas sub-rotinas e chamá-las conforme apropriado. Você também pode usar set para criar um contador (por exemplo, set /a counter=counter+1 ) (esse é um dos motivos para ativar extensões de comando) e if para lógica (por exemplo, if %counter% leq 3 call :compress )

por 30.08.2012 / 05:55
1

Expandindo a resposta da Synetech - este é um script em funcionamento:

@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-Zipza.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%

Está funcionando bem para mim com condições ligeiramente diferentes (por exemplo, if "%%~xI" == ".txt" )

... e não acho que usei hacks :

    
por 15.10.2015 / 23:50

Tags