Подтвердить что ты не робот

Извлечение 7-Zip файла "тихо" - опция командной строки

Я хочу извлечь архив 7-Zip в Python script. Он отлично работает, за исключением того, что он выплевывает детали извлечения (что в моем случае огромно).

Есть ли способ избежать этой подробной информации при извлечении? Я не нашел опции "безмолвной" командной строки для 7z.exe.

Моя команда

7z.exe -o some_dir x some_archive.7z
4b9b3361

Ответ 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. Это ответит да на все запросы. Используйте это только тогда, когда вы уверены.