La extracción de un archivo 7-Zip “silencio” - opción de línea de comandos

StackOverflow https://stackoverflow.com/questions/3774278

  •  04-10-2019
  •  | 
  •  

Pregunta

Quiero extraer una 7-Zip de archivo en una secuencia de comandos de Python. Funciona bien, excepto que se escupe los detalles de extracción (que es muy importante en mi caso).

¿Hay una manera de evitar esta información detallada mientras que la extracción? No he encontrado ninguna opción de línea de comandos "silenciosa" a 7z.exe.

Este es mi mandamiento

7z.exe -o some_dir x some_archive.7z
¿Fue útil?

Solución

Una posibilidad sería la de generar el proceso hijo con popen , por lo que su salida será volver a los padres a ser procesado / muestra (si se desea) o de lo ignoró por completo (crear el objeto de popen con stdout=PIPE y stderr=PIPE para poder recuperar la salida del niño).

Otros consejos

Me acaba de llegar a través de esta en la búsqueda de la misma, pero lo resolvió a mí mismo! Suponiendo que el comando se procesa con Windows / DOS, una solución más sencilla es cambiar su orden a:

7z.exe -o some_dir x some_archive.7z > nul

Es decir, dirigir la salida a un archivo nulo en lugar de la pantalla.

O se podría canalizar la salida al DOS "encontrar" comando para datos específicos de salida solamente, es decir,

7z.exe -o some_dir x some_archive.7z | FIND "ing archive"

Esto sólo daría lugar a la siguiente salida.

Creación de archivo some_archive.7z

o

Actualización some_archive.7z archivo **


Mi solución final era cambiar el comando a

... some_archive.7z | FIND /V "ing  "

Nota doble espacio después de 'ing'. Esto dio lugar a la siguiente salida.

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Scanning

Updating some_archive.7z


Everything is Ok

Esto elimina el procesamiento de archivos individuales, sino que produce un resumen de la operación global, con independencia del tipo de operación.

Al igual que ellos dijeron, para ocultar la mayor parte de los mensajes de la pantalla de llenado que puede utilizar ... some_archive.7z | FIND / V "Compresión", pero que "FIND" eliminaría también los mensajes de error que tenían esa palabra. No sería advertido. Que "FIND" también puede tener que ser cambiado debido a una versión más reciente 7-zip.

7-Zip tiene un prolijo forzada de salida, ningún modo de silencio, mezclas stderr y stdout (*), no guarda los permisos de Unix, etc. Estos comportamientos anti-normalización juntos puso "7-zip" en un mal lugar cuando ser comparado con "alquitrán + bzip2" o "zip", por ejemplo.

(*) "Aguas arriba (Igor Pavlov) no quiere hacer diferentes salidas para los mensajes, a pesar de que se ha pedido varias veces para hacerlo :(" http://us.generation-nt.com/answer/bug-346463-p7zip-stdout-stderr- ayuda-166693561.html - "Igor Pavlov no quiere cambiar este comportamiento" http://sourceforge.net/tracker/?func=detail&aid=1075294&group_id=111810&atid=660493

7zip no tiene una "tranquila" explícita o el modo "silencio" para la extracción de línea de comandos.

Una posibilidad sería la de generar el proceso hijo con popen, por lo que su producción va a volver a la matriz para ser procesado / muestra (si se desea) o bien completamente ignorado (crear el objeto de popen con la salida estándar = PIPE y stderr = TUBO para poder recuperar la salida del niño).

De lo contrario trate de hacer esto:

%COMSPEC% /c "%ProgramFiles%\7-Zip\7z.exe" ...

Ampliando la respuesta @Matthew 's, y esta respuesta https: / /superuser.com/questions/194659/how-to-disable-the-output-of-7-zip Estoy usando FINDSTR en lugar de hallazgo para que pueda múltiples cadena de líneas para excluir y líneas en blanco, así:

7za.exe a test1.zip .\foldertozip | FINDSTR /V /R /C:"^Compressing  " /C:"Igor Pavlov" /C:"^Scanning$" /C:"^$" /C:"^Everything is Ok$"
  • / V: excluir
  • / R: regex
  • / C: "^ Compresión": Principio de la línea, Compresión, 2 plazas de
  • / C: "Escaneo ^ $": la palabra de barrido por sí solo en una línea (begining / final)
  • / C: "^ $": un principio y final sin nada en el medio, es decir, una línea en blanco

Estoy usando / C de manera que un espacio es un espacio, de lo contrario es un separador entre varias palabras a exlude como en esta versión más simple:

FINDSTR /V "Compressing Pavlov Scanning Everytyhing"

(existen las mismas advertencias, si los cambios de redacción en una nueva versión, o si una línea útiles comienza con la palabra "Compresión", no funcionará como se espera).

El | FIND es una buena alternativa para mostrar lo que sucedió sin que se muestre el texto insignificante.

Si se está utilizando 7-zip.exe de Powershell, y sólo desea ver los errores, entonces usted podría intentar algo como esto:

7-zip.exe u <Target> <Source> | Select-String "Error" -Context 10

Esto sólo mostrará la línea "error" mensaje y las 10 líneas que rodean (o el número) para capturar la salida de error específico.

Examinar fuente 7zip encontré interruptor -ba oculto que parece hacer el truco. Por desgracia, no está terminado. Me las arreglé para hacer que funcione con varias modificaciones de las fuentes, pero es sólo un truco. Si alguien está interesado, la variable opción se llama options.EnableHeaders y se requieren cambios en el archivo CPP/7zip/UI/Console/Main.cpp. Como alternativa se puede meter el autor del 7Zip para terminar la función de rastreador . Hay varias peticiones sobre éste y uno de ellos es aquí .

7-zip no tiene esa opción. Además de las líneas impresas en cada archivo comprimido se supone que la exhibición en el mismo lugar, sin salto de línea, borrando la anterior, que tiene un efecto fresco. Desafortunadamente, en algunos contextos (Jenkins ...) que produjo varias líneas ?? que inundan la consola.

NUL (ventanas) es tal vez una solución.

7-zip.exe -o some_dir x some_archive.7z>NUL

Puede detener 7-Zip se muestren mensajes usando el interruptor -y. Esto responde sí a todas las preguntas. Utilice esto sólo cuando esté seguro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top