Я использую 7-zip (в моих пакетных файлах), чтобы упаковать какой-либо каталог и отправить архив по электронной почте. Когда я одновременно использую какой-то файл в этом каталоге, запускается пакетный файл (запускаю пакетные файлы с помощью планировщика заданий), я вижу предупреждения в процессе. После этого, когда архив будет готов, 7-zip отобразит сообщение, подобное этому: «ПРЕДУПРЕЖДЕНИЕ. Невозможно открыть 29 файлов» перед отправкой электронного письма. Когда это происходит, я хочу иметь возможность установить переменную среды (что-то вроде %MESSAGE%
) со значением "29 предупреждений в процессе" и поместить это сообщение в тему письма. Но все, что можно сделать прямо сейчас, это использовать переменную %ERRORLEVEL%
. Если я не могу установить переменную %MESSAGE%
, возможно ли записать предупреждающие сообщения в файл, а затем проанализировать этот файл, чтобы извлечь последнюю строку?
2 ответа
Я предлагаю вам использовать версию командной строки 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 с указанными выше переключателями исключает все строки, содержащие слова в кавычках.)
7-Zip записывает все свои сообщения в стандартный вывод, включая сообщения об ошибках и предупреждения. Это означает, что вы можете собрать все выходные данные, перенаправив стандартный вывод в файл. Это можно сделать, добавив >output_filename
в командную строку после любых аргументов, которые вы передаете 7-Zip. Например:
7z args... >output_filename
После этого вы сможете проанализировать выходной файл и найти строки с "ПРЕДУПРЕЖДЕНИЕМ" или что-то в них. Вы можете сделать это условно в зависимости от того, является ли значение %ERRORLEVEL%
ненулевым, что указывает на наличие какой-либо проблемы, или, в частности, если оно равно 1
что означает наличие нефатальных предупреждений.
Согласно документации это возможные коды выхода (значения %ERRORLEVEL%
):
Код Значение
==== =======
0 Нет ошибок
1 Предупреждение (Не фатальная ошибка (и)). Например, один или несколько файлов были заблокированы
какое-то другое приложение, чтобы они не были сжаты.
2 Фатальная ошибка
7 Ошибка командной строки
8 Недостаточно памяти для работы
255 Пользователь остановил процесс