web-dev-qa-db-fra.com

Commenter plusieurs lignes dans un fichier de commandes DOS

J'ai écrit un énorme fichier de commandes MS DOS. Pour tester ce fichier de commandes, je n'ai besoin que d'exécuter certaines 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.

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

87
user219628

Vous pouvez utiliser un goto pour ignorer le code.

goto comment
...skip this...
:comment
158
pdubs

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 procédant comme suit:

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

Répétez les étapes pour dégager le commentaire

113
cvacca
break||(
 code that cannot contain non paired closing bracket
)

Bien que la solution goto soit une bonne option, elle ne fonctionnera pas entre crochets (y compris les commandes FOR et IF). Mais cela fonctionnera. Vous devez toutefois faire attention à la fermeture des crochets et de la syntaxe non valide pour les commandes FOR et IF, car elles seront analysées.

Mise à jour

La mise à jour dans la réponse dbenham's m'a donné quelques idées. Premièrement - il existe deux cas différents où nous pouvons avoir besoin de commentaires multilignes - dans le contexte d'une parenthèse où GOTO ne peut pas être utilisé et en dehors de celui-ci. Dans le contexte des crochets, nous pouvons utiliser d'autres crochets s'il existe une condition empêchant le code d'être exécuté. Bien que le code reste analysé et que des erreurs de syntaxe soient détectées (FOR, IF, crochets mal fermés, mauvaise expansion des paramètres ..). Donc, si possible, il vaut mieux utiliser GOTO.

Bien qu'il ne soit pas possible de créer une macro/variable utilisée comme étiquette - mais qu'il est possible d'utiliser des macros pour les commentaires de crochets. Deux astuces peuvent toujours ê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 continuer à le trouver (I Je ne sais pas du tout pourquoi c’est ce qui se passe. 2) vous pouvez mettre un seul : à la fin du nom de la variable et une fonction de remplacement/soustraction ne sera pas déclenchée (même sous les extensions activées). Combiné avec les macros pour les commentaires entre parenthèses, les deux cas se ressemblent presque.

Alors voici 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 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 powershell et C styles (< ne peut pas être utilisé car la redirection s’effectue avec un prio supérieur .* _ ne peut pas être utilisé à cause du %*):

@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 c'est un commentaire (bien que ce ne soit 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
)
12
npocmaka

Une autre option consiste à inclure 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é. Donc, vous ne pouvez pas avoir de syntaxe invalide dans. De plus, le commentaire ne peut pas contenir ) _ sauf s’il est échappé ou cité. Pour ces raisons, la solution GOTO acceptée est plus fiable. (La solution GOTO peut aussi être plus rapide)

Mise à jour 2017-09-19

Voici une amélioration cosmétique à solution GOTO de pdub . Je définis une variable d’environnement simple "macro" qui rend la syntaxe de commentaire GOTO un peu meilleure auto-documentante. Bien qu'il soit généralement recommandé que: les étiquettes soient uniques dans un script de traitement par lots, il est correct d'insérer plusieurs commentaires de ce type dans le même script de traitement par lots.

@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 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
)
10
dbenham

Je veux juste mentionner que la solution GOTO de pdub n'est pas tout à fait correct dans le cas où: l'étiquette du 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 DANS LE PREMIER BLOC est ignorée.

1
Charles Chiou

@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:

(redirection by 3) 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
walid2mi