web-dev-qa-db-fra.com

Extraire un fichier 7-Zip "silencieusement" - option de ligne de commande

Je veux extraire un 7-Zip archive dans un script Python. Cela fonctionne très bien sauf que les détails de l'extraction (ce qui est énorme dans mon cas) sont recrutés.

Existe-t-il un moyen d'éviter cette information prolixe lors de l'extraction? Je n'ai trouvé aucune option de ligne de commande "silencieuse" pour 7z.exe.

Ma commande est

7z.exe -o some_dir x some_archive.7z
29
sambha

Une possibilité serait de générer le processus enfant avec popen , afin que sa sortie revienne au parent à traiter/afficher (si vous le souhaitez) ou sinon complètement ignorée (créez votre objet popen avec stdout=PIPE et stderr=PIPE récupérer la sortie de l'enfant).

10
Jerry Coffin

Je viens juste de trouver cela en cherchant la même chose, mais je l'ai résolu moi-même! En supposant que la commande soit traitée avec Windows/DOS, une solution plus simple consiste à changer votre commande en:

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

En d’autres termes, dirigez la sortie vers un fichier null plutôt que vers l’écran.

Ou vous pouvez diriger la sortie vers la commande "trouver" du DOS pour ne générer que des données spécifiques, c'est-à-dire: 

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

Cela entraînerait simplement la sortie suivante.

Création d'archive some_archive.7z

ou

Mise à jour de l’archive some_archive.7z **


Ma dernière solution a été de changer la commande en 

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

Remarque double espace après 'ing'. Cela a abouti à la sortie suivante.

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

Scanning

Updating some_archive.7z


Everything is Ok

Cela supprime le traitement de fichier individuel, mais produit un résumé de l'opération globale, quel que soit le type d'opération.

34
Matthew

Comme ils l'ont dit, vous pourriez utiliser pour masquer la plupart des messages d'écran ... some_archive.7z | FIND/V "Compresser" mais que "FIND" effacerait également les messages d'erreur contenant ce mot. Vous ne seriez pas prévenu. "FIND" devra peut-être également être modifié à cause d'une version 7-Zip plus récente.

7-Zip a une sortie verbeuse forcée, pas de mode silence, mélange stderr et stdout (*), ne sauvegarde pas les autorisations Unix, etc. Ces comportements anti-standards mettent ensemble "7-Zip" au mauvais endroit par rapport à "tar + bzip2" ou "Zip", par exemple.

(*) "En amont (Igor Pavlov) ne veut pas créer de sorties différentes pour les messages, même s'il lui a été demandé à plusieurs reprises de le faire :(" http://us.generation-nt.com/answer/bug- 346463-p7Zip-stdout-stderr-help-166693561.html - "Igor Pavlov ne veut pas modifier ce comportement" http://sourceforge.net/tracker/?func=detail&aid=1075294&group_id=111810&atid=660493

6
Sys

Développer la réponse de @Matthew et cette réponse https://superuser.com/questions/194659/how-to-disable-the-output-of-7-Zip J'utilise FINDSTR au lieu de find pour pouvoir chaîner plusieurs lignes à exclure et les lignes vides également:

7za.exe a test1.Zip .\foldertozip | FINDSTR /V /R /C:"^Compressing  " /C:"Igor Pavlov" /C:"^Scanning$" /C:"^$" /C:"^Everything is Ok$"
  • / V: exclure
  • / R: regex
  • / C: "^ Compressing": début de ligne, Compression, 2 espaces
  • / C: "^ Scanning $": le mot qui scanne seul sur une ligne (début/fin)
  • / C: "^ $": un début et une fin sans rien entre les deux, c’est-à-dire une ligne vide

J'utilise/C pour qu'un espace soit un espace, sinon c'est un séparateur entre plusieurs mots à exclure comme dans cette version plus simple:

FINDSTR /V "Compressing Pavlov Scanning Everytyhing"

(les mêmes réserves existent, si le libellé change dans une nouvelle version ou si une ligne utile commence par le mot "Compression", elle ne fonctionnera pas comme prévu).

3
Thierry_S

7Zip ne dispose pas d'un mode "silencieux" ou "silencieux" explicite pour l'extraction en ligne de commande.

Une possibilité serait d’engendrer le processus enfant avec popen, de sorte que sa sortie revienne au parent afin qu’elle soit traitée/affichée (si désiré) ou complètement ignorée récupérer la sortie de l'enfant).

Sinon, essayez ceci:

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

Le | FIND est une bonne alternative pour montrer ce qui s'est passé sans afficher de texte insignifiant.

2
bruno777

En examinant la source 7Zip, j'ai trouvé un commutateur -ba caché qui semble faire l'affaire. Malheureusement ce n'est pas fini. J'ai réussi à le faire fonctionner avec plusieurs modifications de sources mais ce n'est qu'un hack. Si quelqu'un est intéressé, la variable d'option s'appelle options.EnableHeaders et des modifications sont nécessaires dans le fichier CPP/7Zip/UI/Console/Main.cpp ..... Vous pouvez également demander à l'auteur de 7Zip de terminer la fonctionnalité dans tracker . Il y a plusieurs demandes à ce sujet et l'une d'entre elles est ici .

0
Fr0sT

Si vous exécutez 7-Zip.exe à partir de Powershell et que vous voulez uniquement voir les erreurs, vous pouvez essayer quelque chose comme ceci:

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

Cela affichera uniquement la ligne de message "Erreur" et les 10 lignes environnantes (ou un nombre quelconque) pour capturer la sortie spécifique à l'erreur.

0
Doug J. Huras

7-Zip n'a pas une telle option. De plus, les lignes imprimées sur chaque fichier compressé sont supposées s'afficher au même endroit sans nouvelle ligne, ce qui efface la précédente, ce qui a un effet cool. Malheureusement, dans certains contextes (Jenkins ...), plusieurs lignes sont apparues, inondant la console.

NUL (windows) est peut-être une solution.

7-Zip.exe -o some_dir x some_archive.7z>NUL
0
Sandburg