Como gravar o status de erro para a linha de comando 7-zip na variável (ou, em vez disso, no arquivo de texto)

5

Eu uso o 7-zip (nos meus arquivos batch) para empacotar algum diretório e enviar o arquivo por e-mail. Quando eu uso algum arquivo nesse diretório ao mesmo tempo em que o arquivo em lotes está em execução (inicio os arquivos em lote com o Agendador de Tarefas), vejo mensagens de aviso em andamento. Depois disso, quando o arquivo estiver pronto, o 7-zip exibe uma mensagem como esta: "AVISO: não é possível abrir 29 arquivos" antes de enviar o e-mail. Quando isso acontece, quero poder definir uma variável de ambiente (algo como %MESSAGE% ) com o valor "29 avisos em andamento" e colocar essa mensagem no assunto do email. Mas tudo o que podemos fazer agora é usar a variável %ERRORLEVEL% . Se eu não puder definir uma variável %MESSAGE% , é possível gravar mensagens de aviso em um arquivo e, em seguida, analisar esse arquivo para extrair a última linha?

    
por slesar.mira 13.12.2012 / 23:50

2 respostas

6

Sugiro que você use a Versão da linha de comando do 7-Zip (7za.exe).

Um comando como o seguinte redirecionará a saída all (incluindo do stderr) para Log.txt :

7za a Test.7z *.* >Log.txt 2>&1

Além disso, o 7-Zip retorna os seguintes códigos de saída que você pode usar em seu arquivo de lote com% ERRORLEVEL%:

0 = No error.

1 = Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.

2 = Fatal error.

7 = Command line error.

8 = Not enough memory for operation.

255 = User stopped the process.

Editar: Se você não quiser um log tão detalhado contendo todas as Compressing <filename> linhas, use este comando:

7za a Test.7z *.* | findstr /i /v "pavlov scanning compressing" >Log.txt 2>&1

(O comando findstr com opções acima exclui todas as linhas contendo as palavras entre aspas).

    
por 14.12.2012 / 01:16
1

7-Zip escreve todas suas mensagens para stdout, incluindo mensagens de erro e aviso. Isso significa que você pode coletar todas as saídas dele, redirecionando o stdout para um arquivo. Isso pode ser feito anexando >output_filename à linha de comando depois de qualquer argumento que você esteja passando para o 7-Zip. Por exemplo:

7z args... >output_filename

Depois disso, você deve ser capaz de analisar o arquivo de saída e procurar as linhas com "WARNING" ou qualquer outra coisa nelas. Você pode fazer isso condicionalmente com base no valor de %ERRORLEVEL% em diferente de zero, o que indica que houve algum problema ou, especificamente, em ser 1 , o que significa que houve avisos não fatais.

De acordo com a documentação, estes são os possíveis códigos de saída ( %ERRORLEVEL% values):

Code    Meaning
==== =======
0          No error
1          Warning (Non fatal error(s)). For example, one or more files were locked by
            some other application, so they were not compressed.
2          Fatal error
7          Command line error
8          Not enough memory for operation
255      User stopped the process

    
por 14.12.2012 / 01:22