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


Eu uso o 7-zip (nos meus arquivos batch) para empacotar algum diretório e enviar o arquivo por email. 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, eu quero ser capaz de definir uma variável de ambiente (algo como %MESSAGE%) com o valor "29 avisos em progresso" e colocar esta mensagem no assunto do email. Mas tudo o que podemos fazer agora é usar o %ERRORLEVEL% variável. Se eu não posso definir um %MESSAGE% variável, é possível gravar mensagens de aviso em um arquivo e, em seguida, analisar esse arquivo para extrair a última linha?


5


origem




Respostas:


Eu sugiro que você use o Versão da linha de comando 7-Zip (7za.exe).

Um comando como o seguinte redirecionará todos saída (incluindo de 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 = sem erro.

1 = Aviso (erro não fatal). Por exemplo, um ou mais arquivos foram bloqueados por algum outro aplicativo, portanto, eles não foram compactados.

2 = erro fatal.

7 = Erro na linha de comando.

8 = Memória insuficiente para operação.

255 = O usuário parou o processo.


Editar: Se você não quer um log tão detalhado contendo todos aqueles Compressing <filename> linhas, use este comando em vez disso:

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.)


6



obrigado,% errorlevel% não é tão flexível quanto eu preciso, mas >xxx.log 2>&1 é que preciso quase. quase - porque arquivo de log vai ser muuuito grande ... eu tenho tantos arquivos no meu arquivo, mais de 100k ... mas é uma boa idéia, eull trying to use it for brainstorm tomorrow =) can you spell out what is it - 2> & 1` eu nãot understand it fully? how it work? by the way, im use 7z.exe em vez 7za, mas isso não importa, não vejo diferença entre esses programas - slesar.mira
>Log.txt 2>&1 redirecionará os fluxos de saída padrão (= 1) e de erro padrão (= 2) para Log.txt (consulte Aqui para mais). Além disso, eu acho que você pode usar 7z.exe também, só que eu prefiro 7za.exe quando estou usando apenas a partir da linha de comando. - Karan
Eu não acho que o 7-zip escreva nada para o stderr. - martineau
ótimo ligaçãoobrigado novamente! =) - slesar.mira
@martineau: Talvez não, mas esse extra 2> & 1 garantirá que qualquer coisa direcionada seja capturada. Não há mal em adicioná-lo com certeza, mesmo se o aplicativo normalmente não escreve para stderr (também, por que não? IMO devemos erros diretos para stderr em vez de stdout). - Karan


7-Zip escreve todos 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 para a linha de comando depois de todos os argumentos que você está passando para o 7-Zip. Por exemplo:

7z args... >output_filename

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

Segundo a documentação, estes são os possíveis códigos de saída (%ERRORLEVEL% valores):

Código Significado
  ==== =======
  0 sem erro
    1 Aviso (erro não fatal). Por exemplo, um ou mais arquivos foram bloqueados por
  algum outro aplicativo, então eles não foram compactados.
  2 erro fatal
  7 Erro na linha de comando
  8 Memória insuficiente para operação
  255 Usuário parou o processo


1