9
votes

Comment puis-je transformer conditionnellement @echo ON / OFF dans un fichier de lots Windows?

J'ai un fichier de commandes pouvant être exécuté localement ou sur le serveur de construction pour faire une sorte de travail intéressant. Sur la machine locale, je veux @echo OFF de sorte que votre console ne soit pas pleine de chaînes de débogage. Sur le serveur de construction, je préférerais avoir @echo sur afin que les défaillances puissent être étudiées.

Le contexte du serveur de construction peut être déterminé si une variable d'environnement spéciale existe ( TeamCity_Project_name ). Alors, je pensais que je pouvais faire quelque chose comme xxx

mais, cela ne fonctionne pas, je reçois le si déclaration a fait écho avec tout le reste ... toute pensée?


2 commentaires

Le gère localement une occurrence fréquente et / ou est-ce mauvais le fonctionnement localement donne ces chaînes?


Il n'est pas couru fréquent, il me fait généralement tester des changements, et ce n'est pas mauvais d'avoir la sortie, mais je veux que ce soit sexy !


4 Réponses :


2
votes

Eh bien, il semble que echo est activé par défaut, vous obtiendrez donc la sortie si sortit de l'instruction, vous testez ce conditionnel. Vous devriez commencer par xxx

et ajouter votre conditionnel comme une autre instruction pour évaluer xxx


0 commentaires

15
votes

La commande n'est pas réellement nommée @echo code>. Le @ code> est un drapeau facultatif valide au début d'une instruction pour indiquer que l'écho est supprimé pour cette déclaration. Ainsi, en utilisant le @ code> sur chaque référence à la commande code> echo code> masquer la commande code> echo code> elle-même, mais pas le si code> commande qui le précède.

Mais le problème qui provoque en fait que votre commande échoue à fonctionner comme prévu est que la commande de la première echo code> slurp augmente le reste des jetons sur la ligne comme arguments, donc le ele erfo off code> partie ne sera interprété pas par cmd code>. Étant donné que cmd.exe écho par défaut, il imprime la commande si code>, puis exécute une seule commande echo code> ou rien. Étant donné que le @ code> a signification au début de l'instructe qui est le corps du si code>, aucune commande d'écho ne serait imprimée. P>

en général , la solution à cela est d'utiliser des parenthèses pour délimiter les limites de la commande. Cependant, étant donné que ECHO est activé par défaut et que vous voulez vraiment seulement supprimer si TeamCity_Project code> n'est pas défini, nous pouvons le dire directement. P>

C...>
C...>q17241089.bat

C...>rem this remark will echo

C...>if exist q17241089.bat ()  else
saw q17241089.bat

C...>if not exist q17241089.bat ()  else
bar
saw q17241089.bat
C...>


2 commentaires

Merci d'avoir expliqué le @ plus en détail. J'ai lu les documents et mal interprétés comme un modificateur pour echo seulement . Vous dites qu'il modifie la résolution par défaut des commandes sur la ligne totale droite?


Oui, vous pouvez commencer toute déclaration d'un fichier BAT avec @ et cette instruction ne sera pas échoée. Je vais mettre à jour ma réponse pour ajouter quelques détails que j'ai taquiné tout en essayant de trouver où cela est documenté (apparemment, ce n'est pas).



4
votes

Ensemble de parenthèses (voir Docu ...):

IF DEFINED TEAMCITY_PROJECT_NAME (@ECHO ON) ELSE @ECHO OFF


0 commentaires

2
votes

Comme indiqué dans les réponses antérieures, ECHO est activé par défaut. Une autre manière d'atteindre le même comportement est la suivante:

@if "%TEAMCITY_PROJECT_NAME%" == "" @echo off


0 commentaires