Comment écrire le statut d'erreur pour la ligne de commande 7-zip dans une variable (ou dans un fichier texte)

5

J'utilise 7-zip (dans mes fichiers de commandes) pour créer un répertoire et envoyer les archives par courrier électronique. Lorsque j'utilise un fichier dans ce répertoire en même temps que le fichier de commandes est en cours d'exécution (je démarre les fichiers de commandes avec le planificateur de tâches), des messages d'avertissement sont en cours de traitement. Après cela, lorsque l'archive est prête, 7-zip affiche le message suivant: "AVERTISSEMENT: impossible d'ouvrir 29 fichiers" avant l'envoi du courrier électronique. Lorsque cela se produit, je souhaite pouvoir définir une variable d'environnement (quelque chose comme %MESSAGE%) avec la valeur "29 avertissements en cours" et mettre ce message dans l'objet de l'e-mail. Mais tout ce qui peut être fait pour le moment est d’utiliser la %ERRORLEVEL%variable. Si je ne peux pas définir de %MESSAGE%variable, est-il possible d'écrire des messages d'avertissement dans un fichier, puis d'analyser ce fichier pour extraire la dernière ligne?

slesar.mira
la source

Réponses:

7

Je vous suggère d'utiliser la version en ligne de commande 7-Zip (7za.exe).

Une commande comme celle-ci redirige toutes les sorties (y compris celles de stderr) vers Log.txt :

7za a Test.7z *.* >Log.txt 2>&1

De plus, 7-Zip renvoie les codes de sortie suivants que vous pouvez utiliser dans votre fichier de commandes avec% ERRORLEVEL%:

0 = pas d'erreur.

1 = Avertissement (erreur non fatale). Par exemple, un ou plusieurs fichiers ont été verrouillés par une autre application, ils n'ont donc pas été compressés.

2 = erreur fatale.

7 = erreur de ligne de commande.

8 = Mémoire insuffisante pour le fonctionnement.

255 = l'utilisateur a arrêté le processus.


Edit: Si vous ne voulez pas d’un journal détaillé contenant toutes ces Compressing <filename>lignes, utilisez plutôt la commande suivante:

7za a Test.7z *.* | findstr /i /v "pavlov scanning compressing" >Log.txt 2>&1

(La commande findstr avec les commutateurs ci-dessus exclut toutes les lignes contenant les mots entre guillemets.)

Karan
la source
merci,% errorlevel% n'est pas aussi flexible que j'ai besoin, mais >xxx.log 2>&1est-ce que j'ai presque besoin. presque - parce que le fichier journal sera tellement gros ... j'ai tellement de fichiers dans mes archives, plus de 100k ... mais c'est une bonne idée, je ll trying to use it for brainstorm tomorrow =) can you spell out what is it - 2> & 1` je ne t understand it fully? how it work? by the way, im pas utiliser 7z.exe à la place de 7za, mais c'est le cas peu importe, je ne vois pas de différence entre ces programmes
slesar.mira
>Log.txt 2>&1redirige les flux de sortie standard (= 1) et d'erreur standard (= 2) vers Log.txt (voir ici pour plus d'informations). De plus, je suppose que vous pouvez également utiliser 7z.exe, juste que je préfère 7za.exe lorsque je l'utilise uniquement à partir de la ligne de commande.
Karan
1
Je ne pense pas que 7-zip écrive quoi que ce soit sur stderr.
martineau
excellent lien , merci encore! =)
slesar.mira
@martineau: Peut-être pas, mais ce supplément de 2> & 1 garantira que tout ce qui est dirigé là sera capturé. Pas de mal à l'ajouter à coup sûr, même si l'application n'écrit normalement pas dans stderr (pourquoi pas? IMO, elle devrait diriger les erreurs vers stderr au lieu de stdout).
Karan
1

7-Zip écrit tous ses messages sur stdout, y compris les messages d'erreur et d'avertissement. Cela signifie que vous pouvez collecter tous les résultats en le redirigeant vers un fichier. Cela peut être fait en ajoutant >output_filenameà la ligne de commande après tous les arguments que vous passez à 7-Zip. Par exemple:

7z args... >output_filename

Après cela, vous devriez pouvoir analyser le fichier de sortie et rechercher les lignes avec "WARNING" ou autre chose dans celles-ci. Vous pouvez le faire de manière conditionnelle en fonction de la valeur de %ERRORLEVEL%non différente de zéro, ce qui indique qu'il y a eu un problème, ou spécifiquement de ce 1qui signifie qu'il y a eu des avertissements non fatals.

Selon la documentation, ce sont les codes de sortie possibles ( %ERRORLEVEL%valeurs):

Code Signification
==== =======
0 Aucune erreur
1 Avertissement (erreur non fatale). Par exemple, un ou plusieurs fichiers ont été verrouillés par
            une autre application, ils n'ont donc pas été compressés.
2 Erreur fatale
7 Erreur de ligne de commande
8 Mémoire insuffisante pour l'opération
255 L'utilisateur a arrêté le processus

martineau
la source