Commenter plusieurs lignes dans un fichier batch DOS

98

J'ai écrit un énorme fichier MS DOS Batch. Pour tester ce fichier de commandes, je n'ai besoin d'exécuter que quelques lignes et je souhaite masquer / commenter le reste.

J'ai quelques lignes de commentaires existantes commençant par ::donc je ne peux ::plus utiliser car cela brouillera tous les commentaires.

Comment puis-je résoudre ce problème?

user219628
la source

Réponses:

184

Vous pouvez utiliser a gotopour ignorer le code.

goto comment
...skip this...
:comment
pdubs
la source
11
+1: C'est drôle d'utiliser "goto" pour ça ET ça marche!
rap-2-h du
1
Je pense que ce qui est drôle, c'est qu'il n'y a pas de véritable définition de commentaire dans la ligne de commande, je ne peux tout simplement pas accepter les REMlignes comme lignes de commentaire, cela rend la sortie obscure
mkb
126

Si vous souhaitez ajouter REM au début de chaque ligne au lieu d'utiliser GOTO, vous pouvez utiliser Notepad ++ pour le faire facilement en suivant ces étapes:

  1. Sélectionnez le bloc de lignes
  2. appuyez sur Ctrl-Q

Répétez les étapes pour décommenter

cvacca
la source
6
Bon conseil. le rend beaucoup plus propre.
Venom
1
Wow, je ne savais pas que notepad ++ avait une fonctionnalité si intéressante! En fait, je l'ai vraiment manqué car je suis habitué à "Ctrl + 7" dans Eclipse. Voté jusqu'à 42 ;)
Danny Lo
1
Qu'en est-il de décommenter. Il contient un raccourci pour décommenter tout le bloc.
Bhaskar Singh du
2
@BhaskarSingh Depuis Notepad ++ 7.5.6, vous pouvez simplement mettre en évidence le texte déjà commenté; faites "Ctrl + Q", et il supprimera le commentaire
CreativiTimothy
Si votre cerveau est souvent faible comme le mien à retenir Ctrl-Q, cliquez sur Notepad++: Edit -> Comment/Uncomment.
Timo
13
break||(
 code that cannot contain non paired closing bracket
)

Bien que la gotosolution soit une bonne option, elle ne fonctionnera pas entre crochets (y compris les commandes FOR et IF). Cependant, vous devez faire attention à la fermeture des crochets et à la syntaxe invalide des commandes FORet IFcar elles seront analysées.

Mettre à jour

La mise à jour de la réponse de dbenham m'a donné quelques idées. Premièrement - il y a deux cas différents où nous pouvons avoir besoin de commentaires sur plusieurs lignes - dans le contexte d'une parenthèse où GOTO ne peut pas être utilisé et en dehors. Le contexte de l' intérieur , nous pouvons utiliser une autre parenthèse s'il y a une condition qui empêche le code à executed.Though le Thede de code sera toujours analysé et quelques erreurs de syntaxe sera détecté ( FOR, IF, supports mal fermés, mauvaise extension des paramètres ..). Donc , si c'est possible, il vaut mieux utiliser GOTO.

Bien qu'il ne soit pas possible de créer une macro / variable utilisée comme étiquette - mais il est possible d'utiliser des macros pour les commentaires des crochets, deux astuces peuvent encore être utilisées pour rendre les commentaires GOTO plus symétriques et plus agréables (du moins pour moi). Pour cela, je vais utiliser deux astuces - 1) vous pouvez mettre un seul symbole devant une étiquette et goto sera toujours en mesure de le trouver (je n'ai aucune idée de pourquoi cela, je pense qu'il cherche un lecteur). 2) vous pouvez en mettre un seul : à la fin d'un nom de variable et une fonctionnalité de remplacement / sous-chaîne ne sera pas déclenchée (même sous les extensions activées). Ce qui, combiné avec les macros pour les commentaires entre crochets, peut rendre les deux cas presque identiques.

Voici donc les exemples (dans l'ordre où je les aime le plus):

Avec supports rectangulaires :

@echo off

::GOTO comment macro
set "[:=goto :]%%"
::brackets comment macros
set "[=rem/||(" & set "]=)"

::testing
echo not commented 1

%[:%
  multi 
  line
  comment outside of brackets
%:]%

echo not commented 2

%[:%
  second multi 
  line
  comment outside of brackets
%:]%

::GOTO macro cannot be used inside for
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %[%
        multi line
        comment
    %]%
    echo second not commented line of the %%a execution
)

Avec accolades :

@echo off

::GOTO comment macro
set "{:=goto :}%%"
::brackets comment macros
set "{=rem/||(" & set "}=)"

::testing
echo not commented 1

%{:%
  multi 
  line
  comment outside of brackets
%:}%

echo not commented 2

%{:%
  second multi 
  line
  comment outside of brackets
%:}%

::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %{%
        multi line
        comment
    %}%
    echo second not commented line of the %%a execution
)

Avec parenthèses :

@echo off

::GOTO comment macro
set "(:=goto :)%%"
::brackets comment macros
set "(=rem/||(" & set ")=)"

::testing
echo not commented 1

%(:%
  multi 
  line
  comment outside of brackets
%:)%

echo not commented 2

%(:%
  second multi 
  line
  comment outside of brackets
%:)%

::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %(%
        multi line
        comment
    %)%
    echo second not commented line of the %%a execution
)

Mélange entre les styles PowerShell et C ( <ne peut pas être utilisé car la redirection est avec un prio plus élevé. *Ne peut pas être utilisé à cause de la %*):

@echo off

::GOTO comment macro
set "/#:=goto :#/%%"
::brackets comment macros
set "/#=rem/||(" & set "#/=)"

::testing
echo not commented 1

%/#:%
  multi 
  line
  comment outside of brackets
%:#/%

echo not commented 2

%/#:%
  second multi 
  line
  comment outside of brackets
%:#/%

::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %/#%
        multi line
        comment
    %#/%
    echo second not commented line of the %%a execution
)

Pour souligner que c'est un commentaire (je pense que ce n'est pas si court):

@echo off

::GOTO comment macro
set "REM{:=goto :}REM%%"
::brackets comment macros
set "REM{=rem/||(" & set "}REM=)"

::testing
echo not commented 1

%REM{:%
  multi 
  line
  comment outside of brackets
%:}REM%

echo not commented 2

%REM{:%
  second multi 
  line
  comment outside of brackets
%:}REM%

::GOTO macro cannot be used inside for
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %REM{%
        multi line
        comment
    %}REM%
    echo second not commented line of the %%a execution
)
npocmaka
la source
1
Vous pouvez utiliser rem.||(ou à la rem^ (place. L'intention est un peu plus claire. Voir ma réponse mise à jour.
dbenham le
@dbenham - oui avec rem c'est plus court.
npocmaka
1
Ooh, les formes carrées et bouclées sont sexy. Si j'écrivais du code uniquement pour moi, je pourrais l'utiliser. Mais j'imagine que l'utilisateur moyen verrait cela et dirait WTF.
dbenham
@dbenham - peut-être avez-vous raison.Je peux aussi inclure %rem:%+ %:rem%form pour le rendre plus évident même si cela perdra son charme.Ou seulement slash pour être plus proche du C-style ...
npocmaka
1
@npocmaka C'est génial! Je viens d'apprendre un tas de subtilités de scripts par lots tout en déterminant ce que vous avez fait. De toutes les méthodes de commentaire de bloc que je connais (pour le lot), celle-ci semble être la plus robuste et la plus intelligente. +1 pour combiner hack et style
Jared Gotte
10

Une autre option consiste à enfermer les lignes indésirables dans un bloc IF qui ne peut jamais être vrai

if 1==0 (
...
)

Bien sûr, rien dans le bloc if ne sera exécuté, mais il sera analysé. Vous ne pouvez donc pas avoir de syntaxe invalide à l'intérieur. De plus, le commentaire ne peut pas contenir )sauf s'il est échappé ou entre guillemets. Pour ces raisons, la solution GOTO acceptée est plus fiable. (La solution GOTO peut également être plus rapide)

Mise à jour 19/09/2017

Voici une amélioration cosmétique de la solution GOTO de pdub . Je définis une simple variable d'environnement "macro" qui rend la syntaxe des commentaires GOTO un peu meilleure auto-documentée. Bien qu'il soit généralement recommandé que: les étiquettes soient uniques dans un script batch, il est vraiment acceptable d'incorporer plusieurs commentaires comme celui-ci dans le même script batch.

@echo off
setlocal

set "beginComment=goto :endComment"

%beginComment%
Multi-line comment 1
goes here
:endComment

echo This code executes

%beginComment%
Multi-line comment 2
goes here
:endComment

echo Done

Ou vous pouvez utiliser l'une de ces variantes de la solution de npocmaka . L'utilisation de REM au lieu de BREAK rend l'intention un peu plus claire.

rem.||(
   remarks
   go here
)

rem^ ||(
   The space after the caret
   is critical
)
Dbenham
la source
1

Je veux juste mentionner que la solution GOTO de pdub n'est pas entièrement correcte au cas où: l'étiquette de commentaire apparaît plusieurs fois. Je modifie le code de cette question comme exemple.

@ECHO OFF
SET FLAG=1
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF...
    GOTO comment
    ECHO "COMMENT PART 1"
:comment
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK
)

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF...
    GOTO comment
    ECHO "COMMENT PART"
:comment
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK
)

La sortie sera

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK

La commande ECHO HERE AT TD_NEXT IN THE FIRST BLOCK est ignorée.

Charles Chiou
la source
0

@jeb

Et après avoir utilisé cela, le stderr semble être inaccessible

Non, essayez ceci:

@echo off 2>Nul 3>Nul 4>Nul

   ben ali  
   mubarak 2>&1
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

Mais pourquoi ça marche?

désolé, je réponds à la question en français:

(la redirection par 3> est spécial car elle persiste, on va utiliser pour capturer le flux des erreurs 2> est on va le transformer en un flux persistant à l'ade de 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre environnement de script..par la suite si on veux récupérer le flux 'stderr' il faut faire une autre redirection du handle 2> au handle 1> qui n'est autre que la console ..)

walid2mi
la source
1
Je ne peux pas lire le français, mais il ne semble pas que vous expliquiez pourquoi le flux 2 (stderr) continue d'être désactivé après la redirection initiale. J'ai une théorie et des cas de test réalisables dans 2 articles consécutifs sur dostips.com/forum/viewtopic.php?p=14612#p14612 .
dbenham
(La redirection par 3> est spéciale car elle persiste, nous allons l'utiliser pour capturer le flux d'erreurs 2> est-ce qu'elle le transformera en un flux persistant jusqu'à un de 3> cela nous permettra d'avoir une erreur de gestion pour l'un de nos script d'environnement .. alors si vous voulez récupérer le flux 'stderr' il faut faire une autre redirection de handle 2> pour gérer un> qui n'est autre que la console ..)
user96403
-1

essaye ça:

   @echo off 2>Nul 3>Nul 4>Nul

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause
walid2mi
la source
+1, mais pourquoi ça marche? Et après avoir utilisé cela, le stderr semble être inaccessible
jeb
1
-1, Cela "fonctionne" parce que echo 2> Nul redirige le flux d'erreur standard vers NUL, l'enterrant (les 3> Nul, 4> Nul redirigent les flux auxiliaires sans raison réelle). Cela ne commente pas les lignes, cela empêche simplement l'affichage des messages d'erreur. Ainsi, tout ce qui peut être interprété comme des lignes de commande fonctionnera toujours.
pdubs
3
Le commentaire pdubs est partiellement correct dans la mesure où les commandes sont toujours en cours d'exécution (et échouent car non valides). Mais les commandes valides s'exécuteraient sans échec. Ce n'est donc pas une bonne solution pour commenter des lignes de code. L'explication de la raison pour laquelle le flux 2 (stderr) est désactivé «définitivement» n'est pas correcte.
dbenham
3
J'ai une théorie sur le fonctionnement de la redirection dans Windows batch, et cela explique pourquoi stderr devient "définitivement" désactivé dans cette réponse. La théorie et les tests sont dans 2 articles consécutifs sur dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham