Kommentieren mehrerer Zeilen in der DOS-Batchdatei


98

Ich habe eine riesige MS DOS Batch-Datei geschrieben. Um diese Batch-Datei zu testen, muss ich nur einige Zeilen ausführen und möchte die verbleibenden Zeilen ausblenden / auskommentieren.

Ich habe einige vorhandene Kommentarzeilen, beginnend mit, ::daher kann ich sie nicht ::mehr verwenden, da dadurch alle Kommentare verschlüsselt werden.

Wie kann ich dieses Problem lösen?

Antworten:


182

Sie können a verwenden goto, um Code zu überspringen.

goto comment
...skip this...
:comment

11
+1: Es ist lustig, "goto" dafür zu verwenden UND es funktioniert!
Rap-2-h

1
Ich denke, was lustig ist, ist, dass es keine echte Kommentardefinition in der Befehlszeile gibt. Ich kann REMZeilen einfach nicht als Kommentarzeilen akzeptieren.
Dadurch

125

Wenn Sie REM am Anfang jeder Zeile hinzufügen möchten, anstatt GOTO zu verwenden, können Sie Notepad ++ verwenden, um dies einfach zu tun, indem Sie die folgenden Schritte ausführen:

  1. Wählen Sie den Zeilenblock aus
  2. Drücken Sie Strg-Q

Wiederholen Sie die Schritte zum Kommentieren


6
Netter Tipp. macht es viel sauberer.
Gift

1
Wow, wusste nicht, dass Notepad ++ eine so schöne Funktion hat! Eigentlich habe ich es wirklich verpasst, weil ich es gewohnt bin, in Eclipse Strg + 7 zu verwenden. Bis zu 42 gewählt ;)
Danny Lo

1
Was ist mit Kommentar. Darin eine Verknüpfung zum Kommentieren des gesamten Blocks.
Bhaskar Singh

2
@BhaskarSingh Ab Notepad ++ 7.5.6 können Sie einfach den bereits kommentierten Text markieren. Wenn Sie "Strg + Q" drücken, wird es auskommentiert
CreativiTimothy

Wenn Ihr Gehirn oft so schwach ist wie meins Ctrl-Q, klicken Sie auf Notepad++: Edit -> Comment/Uncomment.
Timo

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

Die gotoLösung ist zwar eine gute Option, funktioniert jedoch nicht in Klammern (einschließlich FOR- und IF-Befehlen). Dies ist jedoch der Fall. Sie sollten jedoch vorsichtig sein, wenn Sie Klammern und ungültige Syntax für FORund IFBefehle schließen, da diese analysiert werden.

Aktualisieren

Das Update in der Antwort des Dbenham gab mir einige Ideen. Erstens - es gibt zwei verschiedene Fälle, in denen wir mehrzeilige Kommentare benötigen können - im Kontext einer Klammer, in der GOTO nicht verwendet werden kann, und außerhalb davon. In Klammern Kontext können wir weitere Klammern verwenden , wenn es eine Bedingung ist , die den Code verhindert , dass der Code thede sein executed.Though wird noch analysiert werden , und einige Syntaxfehler erkannt werden ( FOR, IF, nicht ordnungsgemäß geschlossene Klammern, falsche Parameter Expansion ..). So Wenn es möglich ist, ist es besser, GOTO zu verwenden.

Es ist zwar nicht möglich, ein Makro / eine Variable zu erstellen, die als Beschriftung verwendet wird, aber es ist möglich, Makros für die Kommentare der Klammer zu verwenden. Dennoch können zwei Tricks verwendet werden, um die GOTO-Kommentare symmetrischer und ansprechender zu machen (zumindest für mich). Dafür verwende ich zwei Tricks: 1) Sie können ein einzelnes Symbol vor ein Etikett setzen und goto wird es immer noch finden (ich habe keine Ahnung, warum das so ist. Meine Vermutungen, dass es nach einem Laufwerk sucht). 2) Sie können eine Single : am Ende eines Variablennamens einfügen, und eine Ersetzungs- / Untertretungsfunktion wird nicht ausgelöst (auch nicht bei aktivierten Erweiterungen). In Kombination mit den Makros für Kommentare in Klammern können beide Fälle fast gleich aussehen.

Hier sind die Beispiele (in der Reihenfolge, in der sie mir am besten gefallen):

Mit rechteckigen Klammern :

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

Mit geschweiften Klammern :

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

Mit Klammern :

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

Mischung zwischen Powershell- und C- Stilen ( <kann nicht verwendet werden, da die Umleitung mit einem höheren Prio erfolgt. *Kann wegen der nicht verwendet werden %*):

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

Um zu betonen, dass dies ein Kommentar ist (dachte, es ist nicht so kurz):

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

1
Sie könnten rem.||(oder rem^ (stattdessen verwenden. Die Absicht ist etwas klarer. Siehe meine aktualisierte Antwort.
Dbenham

@dbenham - ja mit rem ist es kürzer.
Npocmaka

1
Ooh, die quadratischen und lockigen Klammerformen sind sexy. Wenn ich Code nur für mich selbst schreiben würde, könnte ich ihn verwenden. Aber ich stelle mir vor, der durchschnittliche Benutzer würde das sehen und WTF sagen.
Dbenham

@dbenham - vielleicht haben Sie Recht. Ich kann auch %rem:%+ %:rem%Form einschließen , um es offensichtlicher zu machen, obwohl es seinen Charme verlieren wird. Oder nur Schrägstrich, um näher am C-Stil zu sein ...
npocmaka

1
@npocmaka Das ist großartig! Ich habe gerade eine Reihe von Batch-Scripting-Komplikationen gelernt, als ich herausgefunden habe, was Sie getan haben. Von allen mir bekannten Blockkommentarmethoden (für Batch) scheint diese die robusteste und cleverste zu sein. +1 für die Kombination von Hack und Stil
Jared Gotte

10

Eine andere Möglichkeit besteht darin, die unerwünschten Zeilen in einen IF-Block einzuschließen, der niemals wahr sein kann

if 1==0 (
...
)

Natürlich wird nichts innerhalb des if-Blocks ausgeführt, aber es wird analysiert. Sie können also keine ungültige Syntax enthalten. Außerdem kann der Kommentar nur enthalten, )wenn er maskiert oder in Anführungszeichen gesetzt ist. Aus diesen Gründen ist die akzeptierte GOTO-Lösung zuverlässiger. (Die GOTO-Lösung kann auch schneller sein)

Update 2017-09-19

Hier ist eine kosmetische Verbesserung der GOTO-Lösung von pdub . Ich definiere eine einfache Umgebungsvariable "Makro", die die GOTO-Kommentarsyntax ein bisschen besser selbstdokumentierend macht. Obwohl allgemein empfohlen wird, dass: Beschriftungen in einem Batch-Skript eindeutig sind, ist es wirklich in Ordnung, mehrere Kommentare wie diesen in dasselbe Batch-Skript einzubetten.

@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

Oder Sie können eine dieser Varianten der Lösung von npocmaka verwenden . Die Verwendung von REM anstelle von BREAK macht die Absicht etwas klarer.

rem.||(
   remarks
   go here
)

rem^ ||(
   The space after the caret
   is critical
)

1

Ich möchte nur erwähnen, dass die GOTO-Lösung von pdub nicht vollständig korrekt ist, falls das Kommentar-Label mehrmals angezeigt wird. Ich ändere den Code aus dieser Frage als Beispiel.

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

Die Ausgabe wird sein

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

Der Befehl ECHO HERE AT TD_NEXT IN THE FIRST BLOCK wird übersprungen.


0

@jeb

Und nachdem Sie dies verwendet haben, scheint der stderr unzugänglich zu sein

Nein, versuchen Sie Folgendes:

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

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

   echo hello Tunisia

  pause

Aber warum funktioniert es?

Entschuldigung, ich beantworte die Frage auf Französisch:

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


1
Ich kann kein Französisch lesen, aber es sieht nicht so aus, als würden Sie ansprechen, warum Stream 2 (stderr) nach Abschluss der ersten Umleitung weiterhin deaktiviert ist. Ich habe eine praktikable Theorie und Testfälle in 2 aufeinander folgenden Beiträgen unter dostips.com/forum/viewtopic.php?p=14612#p14612 .
Dbenham

(Die Umleitung um 3> ist etwas Besonderes, da sie weiterhin besteht. Wir werden sie verwenden, um den Fehlerfluss zu erfassen. 2> Wenn sie in einen dauerhaften Fluss von 3> umgewandelt wird, können wir für jeden unserer Fehler einen Verwaltungsfehler haben Umgebungsskript .. Wenn Sie den Flow 'stderr' wiederherstellen möchten, müssen Sie eine weitere Handle-Umleitung 2> durchführen, um ein> zu behandeln, das nichts anderes als die Konsole ist ..)
user96403

-1

Versuche dies:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1, aber warum funktioniert es? Und nachdem Sie dies verwendet haben, scheint der stderr unzugänglich zu sein
jeb

1
-1, Dies "funktioniert", weil Echo 2> Nul den Standardfehlerstrom zu NUL umleitet und ihn vergräbt (die 3> Nul, 4> Nul leiten Hilfsströme ohne wirklichen Grund um). Dies kommentiert die Zeilen nicht aus, sondern verhindert lediglich, dass Fehlermeldungen angezeigt werden. Alles, was als Befehlszeilen interpretiert werden kann, wird also weiterhin ausgeführt.
pdubs

3
Der pdubs-Kommentar ist teilweise korrekt, da die Befehle noch ausgeführt werden (und fehlschlagen, weil sie nicht gültig sind). Gültige Befehle würden jedoch ohne Fehler ausgeführt. Dies ist also keine gute Lösung zum Auskommentieren von Codezeilen. Die Erklärung, warum Stream 2 (stderr) "permanent" deaktiviert ist, ist nicht korrekt.
Dbenham

3
Ich habe eine Theorie darüber, wie die Umleitung im Windows-Batch funktioniert, und sie erklärt, warum stderr in dieser Antwort "dauerhaft" deaktiviert wird. Die Theorie und Tests sind in 2 aufeinander folgenden Beiträgen unter dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.