5

Я использую 7-zip (в моих пакетных файлах), чтобы упаковать какой-либо каталог и отправить архив по электронной почте. Когда я одновременно использую какой-то файл в этом каталоге, запускается пакетный файл (запускаю пакетные файлы с помощью планировщика заданий), я вижу предупреждения в процессе. После этого, когда архив будет готов, 7-zip отобразит сообщение, подобное этому: «ПРЕДУПРЕЖДЕНИЕ. Невозможно открыть 29 файлов» перед отправкой электронного письма. Когда это происходит, я хочу иметь возможность установить переменную среды (что-то вроде %MESSAGE%) со значением "29 предупреждений в процессе" и поместить это сообщение в тему письма. Но все, что можно сделать прямо сейчас, это использовать переменную %ERRORLEVEL% . Если я не могу установить переменную %MESSAGE% , возможно ли записать предупреждающие сообщения в файл, а затем проанализировать этот файл, чтобы извлечь последнюю строку?

2 ответа2

6

Я предлагаю вам использовать версию командной строки 7-Zip (7za.exe).

Команда, подобная следующей, перенаправит весь вывод (в том числе из stderr) в Log.txt:

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

Кроме того, 7-Zip возвращает следующие коды выхода, которые вы можете использовать в своем пакетном файле с% ERRORLEVEL%:

0 = нет ошибок.

1 = Предупреждение (Не фатальная ошибка (и)). Например, один или несколько файлов были заблокированы каким-либо другим приложением, поэтому они не были сжаты.

2 = фатальная ошибка.

7 = ошибка командной строки.

8 = Недостаточно памяти для работы.

255 = Пользователь остановил процесс.


Изменить: Если вы не хотите такой подробный журнал, содержащий все эти строки Compressing <filename> , используйте эту команду вместо:

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

(Команда findstr с указанными выше переключателями исключает все строки, содержащие слова в кавычках.)

1

7-Zip записывает все свои сообщения в стандартный вывод, включая сообщения об ошибках и предупреждения. Это означает, что вы можете собрать все выходные данные, перенаправив стандартный вывод в файл. Это можно сделать, добавив >output_filename в командную строку после любых аргументов, которые вы передаете 7-Zip. Например:

7z args... >output_filename

После этого вы сможете проанализировать выходной файл и найти строки с "ПРЕДУПРЕЖДЕНИЕМ" или что-то в них. Вы можете сделать это условно в зависимости от того, является ли значение %ERRORLEVEL% ненулевым, что указывает на наличие какой-либо проблемы, или, в частности, если оно равно 1 что означает наличие нефатальных предупреждений.

Согласно документации это возможные коды выхода (значения %ERRORLEVEL% ):

Код Значение
==== =======
0 Нет ошибок
1 Предупреждение (Не фатальная ошибка (и)). Например, один или несколько файлов были заблокированы
            какое-то другое приложение, чтобы они не были сжаты.
2 Фатальная ошибка
7 Ошибка командной строки
8 Недостаточно памяти для работы
255 Пользователь остановил процесс

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