Извлечение 7-Zip файла "тихо" - опция командной строки
Я хочу извлечь архив 7-Zip в Python script. Он отлично работает, за исключением того, что он выплевывает детали извлечения (что в моем случае огромно).
Есть ли способ избежать этой подробной информации при извлечении? Я не нашел опции "безмолвной" командной строки для 7z.exe
.
Моя команда
7z.exe -o some_dir x some_archive.7z
Ответы
Ответ 1
Одной из возможностей было бы создать дочерний процесс с popen
, поэтому его вывод вернется к родительскому объекту, который будет обрабатываться/отображаться (при желании) или полностью игнорируется (создайте свой объект popen
с помощью stdout=PIPE
и stderr=PIPE
, чтобы получить результат от дочернего элемента).
Ответ 2
Я просто натолкнулся на это, ища то же самое, но сам решил! Предполагая, что команда обрабатывается с помощью Windows/DOS, более простым решением является изменение вашей команды на:
7z.exe -o some_dir x some_archive.7z > nul
То есть, направьте вывод на нулевой файл, а не на экран.
Или вы можете передать вывод в команду "find" DOS для вывода только определенных данных, то есть
7z.exe -o some_dir x some_archive.7z | FIND "ing archive"
Это приведет к следующему результату.
Создание архива some_archive.7z
или
Обновление архива some_archive.7z **
Моим окончательным решением было изменить команду на
... some_archive.7z | FIND /V "ing "
Обратите внимание на двойное пространство после 'ing'. Это привело к следующему результату.
7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Scanning
Updating some_archive.7z
Everything is Ok
Это удаляет отдельную обработку файлов, но дает сводную информацию об общей операции, независимо от типа операции.
Ответ 3
Как они сказали, чтобы скрыть большинство сообщений, заполняющих экран, которые вы могли бы использовать... some_archive.7z | FIND/V "Сжатие", но "FIND" также удалит сообщения об ошибках с этим словом. Вы не будете предупреждены. Возможно, что "FIND" может быть изменен из-за более новой версии с 7-значным именем.
7-zip имеет принудительный подробный вывод, без режима молчания, смешивает stderr и stdout (*), не сохраняет разрешения Unix и т.д. Эти антистандартные поведения вместе помещают "7-zip" в плохое место, когда по сравнению с "tar + bzip2" или "zip", например.
(*) "Upstream (Игорь Павлов) не хочет делать разные выходы для сообщений, хотя он несколько раз спрашивал:(" http://us.generation-nt.com/answer/bug-346463-p7zip-stdout-stderr-help-166693561.html - "Игорь Павлов не хочет менять это поведение" http://sourceforge.net/tracker/?func=detail&aid=1075294&group_id=111810&atid=660493
Ответ 4
7zip не имеет явного "тихого" или "бесшумного" режима для извлечения командной строки.
Одной из возможностей было бы порождать дочерний процесс с помощью popen, поэтому его вывод вернется к родительскому объекту, который будет обрабатываться/отображаться (если требуется) или полностью игнорироваться (создайте свой popen-объект с помощью stdout = PIPE и stderr = PIPE чтобы получить выход из дочернего элемента).
В противном случае Попробуйте сделать это:
%COMSPEC% /c "%ProgramFiles%\7-Zip\7z.exe" ...
Ответ 5
Расширение на ответ @Matthew и этот ответ https://superuser.com/questions/194659/how-to-disable-the-output-of-7-zip
Я использую FINDSTR вместо find, поэтому я могу связать несколько строк, чтобы исключить и пустые строки:
7za.exe a test1.zip .\foldertozip | FINDSTR /V /R /C:"^Compressing " /C:"Igor Pavlov" /C:"^Scanning$" /C:"^$" /C:"^Everything is Ok$"
- /V: исключить
- /R: regex
- /C: "^ Сжатие": начало строки, Сжатие, 2 пробела
- /C: "^ Сканирование $": слово Сканирование самостоятельно по строке (начало/конец)
- /C: "^ $": начало и конец без чего-либо между ними, т.е. пустая строка
Я использую /C, чтобы пространство было пробелом, иначе это разделитель между несколькими словами для исключения, как в этой более простой версии:
FINDSTR /V "Compressing Pavlov Scanning Everytyhing"
(существуют те же предостережения, если формулировка изменяется в новой версии, или если полезная строка начинается со слова "Сжатие", она не будет работать так, как ожидалось).
Ответ 6
| FIND
- хорошая альтернатива, чтобы показать, что произошло без отображения незначительного текста.
Ответ 7
Если вы используете 7-zip.exe из Powershell и хотите видеть только ошибки, вы можете попробовать что-то вроде этого:
7-zip.exe u <Target> <Source> | Select-String "Error" -Context 10
Это будет отображать только строку сообщения "Ошибка" и окружающие 10 строк (или любое другое число) для захвата вывода, специфичного для ошибки.
Ответ 8
7-zip не имеет такой опции. Кроме того, строки, напечатанные в каждом сжатом файле, должны отображаться в том же месте без новой строки, стирая предыдущую, что имеет крутой эффект. К сожалению, в некоторых контекстах (Дженкинс...) он выдал несколько строк, заполняя консоль.
NUL
(windows) может быть одним из решений.
7-zip.exe -o some_dir x some_archive.7z>NUL
Ответ 9
Исследуя 7zip-источник, я обнаружил скрытый переключатель -ba
, который, кажется, делает свое дело. К сожалению это не закончено. Мне удалось заставить его работать с несколькими модификациями исходников, но это всего лишь взлом. Если кому-то интересно, переменная параметра называется options.EnableHeaders
, и изменения требуются в файле CPP/7zip/UI/Console/Main.cpp
.
Кроме того, вы можете нажать 7Zip автора, чтобы завершить функцию в трекере. Есть несколько запросов на это, и один из них здесь.
Ответ 10
Чтобы показать только последние 4 строки...
7z x -y some_archive.7z | tail -4
дает мне:
Everything is Ok
Size: 917519
Compressed: 171589
Переключатель -y должен ответить "да" на все вопросы (в моем случае переопределить существующие файлы).
Ответ 11
Вы можете запретить 7-Zip отображать подсказки с помощью переключателя -y. Это ответит да на все запросы. Используйте это только тогда, когда вы уверены.