Commentant plusieurs lignes dans le fichier batch DOS

J'ai écrit un énorme fichier Batch MS DOS. Pour tester ce fichier batch, j'ai besoin d'exécuter quelques lignes seulement et je veux masquer / commenter restant.

J'ai quelques lignes de commentaire existantes commençant par:: par conséquent, je ne peux plus utiliser :: car il va brouiller tous les commentaires.

Toute aide à cet égard sera appréciée. Merci d'avance, Jay

75
demandé sur user219628 2011-12-16 01:36:10

6 réponses

Vous pouvez utiliser un goto pour ignorer le code.

goto comment
...skip this...
:comment
141
répondu pdubs 2011-12-15 21:39:54

Si vous voulez 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

97
répondu cvacca 2012-07-12 18:54:57

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

if 1==0 (
...
)

Bien sûr, rien dans le bloc if ne sera exécuté, mais il sera analysé. Donc, vous ne pouvez pas avoir de syntaxe invalide à l'intérieur. En outre, le commentaire ne peut pas contenir ) à moins qu'il ne soit échappé ou cité. Pour ces raisons, la solution Goto acceptée est plus fiable. (La solution GOTO peut également être plus rapide)

Mise à Jour 2017-09-19

Voici une amélioration cosmétique pour solution Goto de pdub . Je définis une variable d'environnement simple "macro"qui rend la syntaxe des commentaires GOTO un peu mieux documentée. Bien qu'il soit généralement recommandé que: les étiquettes soient uniques dans un script batch, il est vraiment acceptable d'intégrer 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 npocmaka la solution de. 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
)
10
répondu dbenham 2017-10-06 13:35:43
break||(
 code that cannot contain non paired closing bracket
)

Bien que la solution goto soit une bonne option, elle ne fonctionnera pas entre parenthèses (y compris les commandes FOR ET IF).Mais cette volonté. Bien que vous devriez faire attention à la fermeture des crochets et à la syntaxe invalide pour les commandes FOR et IF car elles seront analysées.

mise à Jour

La mise à jour de la réponse de de dbenham m'a donné quelques idées. Tout d'abord-il y a deux cas différents où nous pouvons avoir besoin de commentaires multi-lignes-dans un support contexte où GOTO ne peut pas être utilisé et à l'extérieur. Contexte entre parenthèses nous pouvons utiliser d'autres parenthèses s'il y a une condition qui empêche l'exécution du code.Bien que le code thede sera toujours analysé et certaines erreurs de syntaxe seront détectées (FOR,IF ,crochets mal fermés, extension de paramètre incorrecte..). donc, si c'est possible, il est préférable d'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 parenthèses commentaire.Encore deux astuces peuvent être utilisées faire le GOTO commentaires plus symétrique et plus agréable (au 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 pour le trouver (je n'ai aucune idée pourquoi est this.My guues il est à la recherche d'un lecteur). 2) vous pouvez mettre un seul : à la fin d'un nom de variable et une fonction de remplacement / soustraction ne sera pas déclenchée (même sous les extensions activées). Qui, combiné avec les macros pour les commentaires entre parenthèses peuvent faire les deux cas à regarder presque la même chose.

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

Avec crochets 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 les 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 entrepowershell et c styles (< ne peut pas être utilisé car la redirection est avec prio supérieur.* ne peut pas être utilisé en raison 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
)

À emphase c'est un commentaire (pensé 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
)
10
répondu npocmaka 2017-10-06 19:40:54

@jeb

Et après 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éciale car elle persiste, on va l'utiliser pour capturer le flux des erreurs 2> est on va le transformer en un flux persistant à l'issue de 3 > ceci va nous permettons d'avoir une gestion des erreurs pour tout notre environnement de script..par la suite si on veut 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.. )

0
répondu walid2mi 2011-12-16 11:21:04

Essayez ceci:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause
-1
répondu walid2mi 2011-12-16 09:24:05