Welchen Kommentarstil soll ich in Batchdateien verwenden?

284

Ich habe einige Batch-Dateien geschrieben und bin auf dieses Benutzerhandbuch gestoßen , das sehr informativ war. Es hat mir gezeigt, dass Zeilen nicht nur mit REM, sondern auch mit kommentiert werden können ::. Es sagt:

Kommentare im Stapelcode können mithilfe eines Doppelpunkts vorgenommen werden. Dies ist besser als die Verwendung des REM-Befehls, da Beschriftungen vor Umleitungssymbolen verarbeitet werden. ::<remark>verursacht keine Probleme, rem <remark>erzeugt aber Fehler.

Warum verwenden dann die meisten Anleitungen und Beispiele, die ich sehe, den REMBefehl? Funktioniert ::unter allen Windows-Versionen?

MikeFHay
quelle
3
Nur zur Veranschaulichung, ich habe Probleme gesehen, wenn "REM" verwendet wird, um eine Zeile mit Umleitung unter Windows 98 auskommentieren zu können.
Digger
6
Nebenbei bemerkt, in Übereinstimmung mit dem Kommentar von @ Digger: Die verknüpfte Anleitung bezieht sich auf DOS ( command.exe), nicht auf cmd.exeden NT- Befehlsprozessor, wie er unter Windows 2000 verfügbar ist. rem <remark>funktioniert in letzterem einwandfrei (seit mindestens Windows XP) und REMist der offizielle Bestandteil und die sicherste Wahl insgesamt; Während ::es seine Vorteile hat, ist es letztendlich ein Hack, der innerhalb von (…)Blöcken problematisch ist (wie in vielen Antworten hier diskutiert).
mklement0
1
Welche Situation mit REM verursacht also genau Fehler?
TS

Antworten:

360

tl; dr: REM ist die dokumentierte und unterstützte Methode zum Einbetten von Kommentaren in Batchdateien.


::ist im Wesentlichen ein leeres Etikett, zu dem niemals gesprungen werden kann, während REMes sich um einen tatsächlichen Befehl handelt, der einfach nichts tut. In keinem Fall (zumindest unter Windows 7) verursacht das Vorhandensein von Umleitungsoperatoren ein Problem.

Es ::ist jedoch bekannt, dass es sich unter bestimmten Umständen in Blöcken schlecht verhält und nicht als Etikett, sondern als eine Art Laufwerksbuchstabe analysiert wird. Ich weiß ein wenig, wo genau, aber das allein reicht aus, um mich REMausschließlich zu benutzen . Dies ist die dokumentierte und unterstützte Methode zum Einbetten von Kommentaren in Batchdateien, während sie ::lediglich ein Artefakt einer bestimmten Implementierung ist.


Hier ist ein Beispiel, bei dem ::ein Problem in einer FORSchleife auftritt.

Dieses Beispiel funktioniert nicht in einer Datei, die test.batauf Ihrem Desktop aufgerufen wird :

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    ::echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

Während dieses Beispiel als Kommentar korrekt funktioniert:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    REM echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

Das Problem scheint zu sein, wenn versucht wird, die Ausgabe in eine Datei umzuleiten. Meine beste Vermutung ist, dass es ::als Escape-Label interpretiert wird :echo.

Joey
quelle
1
@Firedan: Ist der Name der Batchdatei und ihr Speicherort relevant (zusammen mit dem Namen und dem Speicherort der Datei, zu der umgeleitet werden soll?). Ansonsten wäre es schön, das Beispiel zu vereinfachen.
Joey
15
Nette
Geste,
2
Wenn die Verwendung von Variablen verzögert in der Zeile steht, verursacht :: einige Fehlermeldungen, z. B. Kann keinen bestimmten Festplattentreiber finden ..... Verwenden Sie also besser REM.
Scott Chu
2
:: Kommentare werden analysiert und Sonderzeichen wie> | Beenden Sie den Kommentar, und der folgende Text wird nicht kommentiert.
Mosh
4
@mosh ist richtig. Beispielsweise werden %VAR%Variablen erweitert. Angenommen, Sie haben (falsch) set TARGET=C:\Program Files (x86)\"foo.exe"und in einem DO(..)Ausdruck, den Sie haben :: echo %TARGET%, wird ein Fehler angezeigt, da der Ausdruck (x86)erweitert wird, bevor der gesamte Ausdruck ausgewertet wird, was zu einem ungültigen DO(..)Ausdruck und sehr unerklärlichen Fehlern führt (in diesem Fall war "\ Microsoft zu diesem Zeitpunkt unerwartet" " ). Sie brauchen nicht einmal |oder >in Ihrem Ausdruck. A ::ist jedoch kein wirklicher Kommentar REM.
Abel
161

Kommentare mit REM

A REMkann eine vollständige Zeile, auch ein mehrzeiliges Caret am Zeilenende, bemerken, wenn es nicht das Ende des ersten Tokens ist.

REM This is a comment, the caret is ignored^
echo This line is printed

REM This_is_a_comment_the_caret_appends_the_next_line^
echo This line is part of the remark

REM gefolgt von einigen Zeichen .:\/=funktioniert etwas anders. Es wird kein kaufmännisches Und kommentiert, sodass Sie es als Inline-Kommentar verwenden können.

echo First & REM. This is a comment & echo second

Um jedoch Probleme mit vorhandenen Dateien zu vermeiden REM, sollte REM.batoder REM;.batnur eine modifizierte Variante verwendet werden.

REM^;<space>Comment

Und für den Charakter ;ist auch einer erlaubt;,:\/=

REM ist ungefähr 6 mal langsamer als ::(getestet auf Win7SP1 mit 100000 Kommentarzeilen).
Für eine normale Verwendung ist dies nicht wichtig (58 µs gegenüber 360 µs pro Kommentarzeile).

Kommentare mit ::

A führt:: immer ein Zeilenend-Caret aus.

:: This is also a comment^
echo This line is also a comment

Beschriftungen und auch die Kommentarbezeichnung :: haben eine spezielle Logik in Klammern.
Sie umfassen immer zwei Zeilen SO: goto Befehl funktioniert nicht .
Daher werden sie für Klammerblöcke nicht empfohlen, da sie häufig die Ursache für Syntaxfehler sind.

Es wird ECHO ONeine REMZeile angezeigt, jedoch keine kommentierte Zeile::

Beide können den Rest der Zeile nicht wirklich auskommentieren, so dass ein einfacher %~einen Syntaxfehler verursacht.

REM This comment will result in an error %~ ...

REM kann den Batch-Parser jedoch frühzeitig stoppen, noch bevor die Sonderzeichenphase abgeschlossen ist.

@echo ON
REM This caret ^ is visible

Mit & REM oder & :: können Sie am Ende der Befehlszeile einen Kommentar hinzufügen. Dieser Ansatz funktioniert, weil '&' einen neuen Befehl in derselben Zeile einführt.

Kommentare mit Prozentzeichen% = Kommentar =%

Es gibt einen Kommentarstil mit Prozentzeichen.

In Wirklichkeit sind dies Variablen, aber sie werden zu nichts erweitert.
Der Vorteil ist jedoch, dass sie auch ohne in die gleiche Zeile gestellt werden können &.
Das Gleichheitszeichen stellt sicher, dass eine solche Variable nicht existieren kann.

echo Mytest
set "var=3"     %= This is a comment in the same line=%

Der Prozentstil wird für Stapelmakros empfohlen, da er das Laufzeitverhalten nicht ändert, da der Kommentar entfernt wird, wenn das Makro definiert wird.

set $test=(%\n%
%=Start of code=% ^
echo myMacro%\n%
)
jeb
quelle
2
Es sollte beachtet werden, dass %=Kommentare mit Anführungszeichen pingelig sind, dh set foo=bar %=bazzu einer fooErweiterung auf führen bar %=baz, wie dies der Fall ist set foo="bar" %=baz, während dies nur set "foo=bar" %=bazzu einer fooErweiterung auf barwie beabsichtigt führt.
LastStar007
3
@ LastStar007: set "foo=bar"Es ist generell empfehlenswert, immer einen Anführungszeichenstil zu verwenden , da dies die robusteste Form ist, die den Wert klar begrenzt. Das Problem Sie beschreiben , ist in inhärenten set‚s Verhalten und nicht spezifisch für %= … =%Kommentare: es sei denn , Sie verwenden "var=val"zitiert, sethält alles, was die folgt , =den Wert, einschließlich nachfolgende Leerzeichen (durch das Ende der Zeile oder ggf. den Start der nächste Inline-Befehl).
mklement0
28

Eine andere Alternative besteht darin, den Kommentar als variable Erweiterung auszudrücken, die sich immer zu nichts erweitert.

Variablennamen dürfen keine =undokumentierten dynamischen Variablen wie
%=ExitCode%und enthalten %=C:%. Kein Variablenname darf jemals eine =nach der 1. Position enthalten. Daher verwende ich manchmal Folgendes, um Kommentare in einen Block in Klammern aufzunehmen:

::This comment hack is not always safe within parentheses.
(
  %= This comment hack is always safe, even within parentheses =%
)

Es ist auch eine gute Methode zum Einfügen von Inline-Kommentaren

dir junk >nul 2>&1 && %= If found =% echo found || %= else =% echo not found

Das Führen =ist nicht notwendig, aber ich mag es, wenn für die Symmetrie.

Es gibt zwei Einschränkungen:

1) Der Kommentar darf nicht enthalten %

2) Der Kommentar darf nicht enthalten :

Dbenham
quelle
LOL! Machen Sie es zu einer übergroßen Variablen! Genius! %=ExitCode%? Ordentlich. Lerne jeden Tag etwas Neues!
James K
Sie implizieren, dass das Trailing =notwendig ist. Aber es scheint nicht so zu sein.
James K.
4
@JamesK - Ich benutze das Trailing, =so dass so etwas wie% = ExitCode =% ein "Kommentar" und keine dynamische Variable ist. Ich bevorzuge es, einen Stil zu verwenden, der immer funktioniert (mit Ausnahme der Einschränkungen, die am Ende der Antwort angegeben sind).
Dbenham
Unter stackoverflow.com/a/20169219/1689714 finden Sie eine Untersuchung der dynamischen Variablen (z. B.% = ExitCode %% = ExitCodeAscii %% = C: %% = D: %% __ CD __% usw.), was sie bedeuten, wie sie sind eingestellt, etc ..
Kieron Hardy
25

Nachdem mir klar wurde, dass ich mit dem Label ::Kommentare abgeben und Code REMauskommentieren konnte, sah es für mich einfach hässlich aus. Wie bereits erwähnt, kann der Doppelpunkt Probleme verursachen, wenn er in ()blockiertem Code verwendet wird. Ich habe jedoch eine Problemumgehung entdeckt, indem ich zwischen den Bezeichnungen ::und gewechselt habe:space

:: This, of course, does
:: not cause errors.

(
  :: But
   : neither
  :: does
   : this.
)

Es ist nicht hässlich REMund fügt Ihrem Code tatsächlich einen kleinen Stil hinzu.

Außerhalb der von mir verwendeten Codeblöcke ::und innerhalb dieser wechsle ich zwischen ::und :.

Übrigens können Sie bei großen Ansätzen von Kommentaren, wie im Header Ihrer Batch-Datei, spezielle Befehle und Zeichen vollständig vermeiden, indem Sie einfach gotoIhre Kommentare überschreiben. Auf diese Weise können Sie jede gewünschte Methode oder jeden gewünschten Markup-Stil verwenden, obwohl dies, wenn Sie CMDjemals tatsächlich versuchen würden, diese Zeilen zu verarbeiten, ein Rauschen auslösen würde.

@echo off
goto :TopOfCode

=======================================================================
COOLCODE.BAT

Useage:
  COOLCODE [/?] | [ [/a][/c:[##][a][b][c]] INPUTFILE OUTPUTFILE ]

Switches:
       /?    - This menu
       /a    - Some option
       /c:## - Where ## is which line number to begin the processing at.
         :a  - Some optional method of processing
         :b  - A third option for processing
         :c  - A forth option
  INPUTFILE  - The file to process.
  OUTPUTFILE - Store results here.

 Notes:
   Bla bla bla.

:TopOfCode
CODE
.
.
.

Verwenden Sie, was jemals Notation Sie wollen *‚s, @‘ s usw.

James K.
quelle
Wie gehen Sie mit dem /?Schalter um, damit er dieses Menü druckt?
Hoang
1
@hoang setlocal ENABLEDELAYEDEXPANSION <NEWLINE> set var =% ~ 1 <NEWLINE> echo erster Parameter ist% 1 <NEWLINE> IF! VAR! == "/?" (GOTO USAGE) <NEWLINE>: USAGE <NEWLINE> Echo bla
bla
16
Das Abwechseln von einfachen und doppelten Doppelpunkten muss Kopfschmerzen verursachen, wenn Sie eine Zeile einfügen oder löschen.
@ GL2014 im Grunde sind Sie sagen „Sie nicht drucken dieses Menü“. Für Ihren Beispielcode muss jeder Zeile der Verwendungshinweise ein Echo vorangestellt werden. Die Antwort von James K ist insofern irreführend, als sie darauf hindeutet, dass es eine Möglichkeit gibt, die Verwendungshinweise so zu drucken, wie sie geschrieben wurden.
Timbo
1
@ Timbo Ich habe eine Unterroutine ( :PrintHelp) für diese Antwort geschrieben , die tatsächlich das tut, was @hoang verlangt. Ich benutze <HELP> und </ HELP> als Marker, aber Sie können alles verwenden, was zu Ihnen passt.
cdlvcdlv
21

Diese Antwort versucht eine pragmatische Zusammenfassung der vielen großartigen Antworten auf dieser Seite:

Die großartige Antwort von jeb verdient besondere Erwähnung, da sie wirklich ausführlich ist und viele Randfälle abdeckt.
Insbesondere weist er darauf hin, dass eine falsch konstruierte Variablen- / Parameterreferenz, wie %~sie eine der folgenden Lösungen - einschließlich REMZeilen - beschädigen kann .


Ganzzeilige Kommentare - der einzige direkt unterstützte Stil:

  • REM(oder Fallvarianten davon) ist das einzige offizielle Kommentarkonstrukt und die sicherste Wahl - siehe Joeys hilfreiche Antwort .

  • ::ist ein (weit verbreiteter) Hack , der Vor- und Nachteile hat :

    • Vorteile :

    • Nachteile :

      • Innerhalb (...)Blöcke, ::können brechen Sie den Befehl , und die Regeln für die sichere Anwendung sind restriktiv und nicht leicht zu merken - siehe unten.

Wenn Sie verwenden möchten:: , haben Sie folgende Möglichkeiten:

  • Entweder : Um sicher zu gehen, machen Sie eine Ausnahme innerhalb von (...)Blöcken und verwenden Sie sie REMdort, oder platzieren Sie keine Kommentare darin (...) .
  • Oder : Merken Sie sich die schmerzlich restriktiven Regeln für die sichere Verwendung von ::Innenräumen(...) , die im folgenden Ausschnitt zusammengefasst sind:
@echo off

for %%i in ("dummy loop") do (

  :: This works: ONE comment line only, followed by a DIFFERENT, NONBLANK line.
  date /t

  REM If you followed a :: line directly with another one, the *2nd* one
  REM would generate a spurious "The system cannot find the drive specified."
  REM error message and potentially execute commands inside the comment.
  REM In the following - commented-out - example, file "out.txt" would be
  REM created (as an empty file), and the ECHO command would execute.
  REM   :: 1st line
  REM   :: 2nd line > out.txt & echo HERE

  REM NOTE: If :: were used in the 2 cases explained below, the FOR statement
  REM would *break altogether*, reporting:
  REM  1st case: "The syntax of the command is incorrect."
  REM  2nd case: ") was unexpected at this time."

  REM Because the next line is *blank*, :: would NOT work here.

  REM Because this is the *last line* in the block, :: would NOT work here.
)

Emulation anderer Kommentarstile - Inline und Multi-Line:

Beachten Sie, dass keiner dieser Stile direkt von der Batch-Sprache unterstützt wird , aber emuliert werden kann .


Inline-Kommentare :

* Die folgenden Codefragmente werden als Ersatz verfür einen beliebigen Befehl verwendet, um das Experimentieren zu erleichtern.
* Damit SETBefehle mit Inline-Kommentaren ordnungsgemäß funktionieren, zitieren Sie das name=valueTeil in doppelte Anführungszeichen . zB , SET "foo=bar". [1]

In diesem Zusammenhang können wir zwei Untertypen unterscheiden:

  • EOL-Kommentare ([bis zum] Zeilenende), die nach einem Befehl platziert werden können und sich immer bis zum Zeilenende erstrecken (wiederum mit freundlicher Genehmigung von Jebs Antwort ):

    • ver & REM <comment>nutzt die Tatsache, dass REMes sich um einen gültigen Befehl handelt &, mit dem ein zusätzlicher Befehl nach einem vorhandenen Befehl eingefügt werden kann.
    • ver & :: <comment>funktioniert auch, ist aber wirklich nur außerhalb von (...)Blöcken verwendbar , da seine sichere Verwendung dort noch eingeschränkter ist als die Verwendung von ::Standalone.
  • Intra-Line-Kommentare , die zwischen mehreren Befehlen in einer Zeile oder im Idealfall sogar innerhalb eines bestimmten Befehls platziert werden.
    Intra-Line-Kommentare sind die flexibelste (einzeilige) Form und können per Definition auch als EOL-Kommentare verwendet werden.

    • ver & REM^. ^<comment^> & verErmöglicht das Einfügen eines Kommentars zwischen Befehlen (wiederum mit freundlicher Genehmigung von Jebs Antwort ). Beachten Sie jedoch, wie <und >wie es ^entkommen muss, da die folgenden Zeichen verwendet werden. kann nicht< > | unverändert verwendet werden: (während nicht entkommen &oder &&oder ||den nächsten Befehl starten ).

    • %= <comment> =%, Wie in detailliert dbenham die große Antwort ist die flexibelste Form , weil sie platziert werden kann innerhalb (unter den Argumenten) ein Befehl .
      Es nutzt die Syntax der Variablenerweiterung auf eine Weise, die sicherstellt, dass der Ausdruck immer auf die leere Zeichenfolge erweitert wird - solange der Kommentartext weder %noch:
      Like enthältREM , %= <comment> =%funktioniert er sowohl außerhalb als auch innerhalb von (...)Blöcken gut, ist jedoch optisch unverwechselbarer. Die einzigen Nachteile sind, dass es schwieriger zu tippen ist, leichter syntaktisch falsch zu liegen und nicht allgemein bekannt ist, was das Verständnis des Quellcodes, der die Technik verwendet, beeinträchtigen kann.


Mehrzeilige Kommentare (Ganzzeilenblock) :

  • Die Antwort von James K zeigt, wie eine gotoAnweisung und ein Etikett verwendet werden , um einen mehrzeiligen Kommentar beliebiger Länge und Inhalt abzugrenzen (in seinem Fall zum Speichern von Nutzungsinformationen).

  • Zees Antwort zeigt, wie man ein "Null-Label" verwendet , um einen mehrzeiligen Kommentar zu erstellen, obwohl darauf geachtet werden muss, alle inneren Zeilen mit zu beenden ^.

  • Der Blog-Beitrag von Rob van der Woude erwähnt eine weitere etwas undurchsichtige Option, mit der Sie eine Datei mit einer beliebigen Anzahl von Kommentarzeilen beenden können : Beim Öffnen wird (nur alles, was danach kommt, ignoriert , solange es kein (Nicht-) enthält. ^-escaped) ), dh solange der Block nicht geschlossen ist .


[1] Die Verwendung SET "foo=bar"zum Definieren von Variablen, dh das Setzen von doppelten Anführungszeichen um den Namen und =den kombinierten Wert, ist in Befehlen wie erforderlich SET "foo=bar" & REM Set foo to bar., um sicherzustellen, dass das, was dem beabsichtigten Variablenwert folgt (in diesem Fall bis zum nächsten Befehl) ein einzelnes Leerzeichen) wird nicht versehentlich Teil davon.
(Nebenbei: SET foo="bar"würde das Problem nicht nur nicht vermeiden, sondern die doppelten Anführungszeichen zum Teil des Werts machen ).
Beachten Sie, dass dieses Problem inhärent ist SETund sogar für versehentlich nachgestellte Leerzeichen nach dem Wert gilt. Daher ist es ratsam, immer den SET "foo=bar"Ansatz zu verwenden.

mklement0
quelle
7

Auf dieser Seite erfahren Sie, dass die Verwendung von "::" unter bestimmten Bedingungen schneller ist. Dies ist nur eine Sache, die Sie bei der Auswahl berücksichtigen sollten

mishal153
quelle
2
Dies ist wahr, zumindest für Win7SP1, ::kann 6-mal schneller sein alsREM
jeb
4

gute Frage ... Ich habe auch lange nach dieser Funktionalität gesucht ...

Nach mehreren Tests und Tricks scheint die bessere Lösung die offensichtlichere zu sein ...

-> Der beste Weg, dies zu tun, um zu verhindern, dass die Parser-Integrität fehlschlägt, ist die Wiederverwendung von REM:

echo this will show until the next REM &REM this will not show

Sie können auch mehrzeilig mit dem Trick "NULL LABEL" verwenden ... (Vergessen Sie das ^ am Ende der Zeile nicht, um die Kontinuität zu gewährleisten.)

::(^
this is a multiline^
comment... inside a null label!^
dont forget the ^caret at the end-of-line^
to assure continuity of text^ 
)
ZEE
quelle
3

James K, es tut mir leid, dass ich mich in einem angemessenen Teil meiner Aussagen geirrt habe. Der Test, den ich gemacht habe, war der folgende:

@ECHO OFF
(
  :: But
   : neither
  :: does
   : this
  :: also.
)

Dies entspricht Ihrer Beschreibung des Wechsels, schlägt jedoch mit einem ") fehl, das zu diesem Zeitpunkt unerwartet war." Fehlermeldung.

Ich habe heute einige weitere Tests durchgeführt und festgestellt, dass Alternieren nicht der Schlüssel ist, aber es scheint, dass der Schlüssel eine gerade Anzahl von Zeilen hat, keine zwei Zeilen hintereinander, die mit Doppelpunkt (: :) beginnen und nicht mit Doppelpunkt enden . Folgendes berücksichtigen:

@ECHO OFF
(
   : But
   : neither
   : does
   : this
   : cause
   : problems.
)

Das funktioniert!

Aber bedenken Sie auch Folgendes:

@ECHO OFF
(
   : Test1
   : Test2
   : Test3
   : Test4
   : Test5
   ECHO.
)

Die Regel, eine gerade Anzahl von Kommentaren zu haben, scheint nicht zu gelten, wenn ein Befehl endet.

Leider ist das nur so eichhörnchenhaft, dass ich nicht sicher bin, ob ich es verwenden möchte.

Die beste und sicherste Lösung, die ich mir vorstellen kann, ist, wenn ein Programm wie Notepad ++ REM als Doppelpunkt liest und dann Doppelpunkte als REM-Anweisungen zurückschreibt, wenn die Datei gespeichert wird. Aber mir ist ein solches Programm nicht bekannt, und mir sind auch keine Plugins für Notepad ++ bekannt, die dies tun.

Darin
quelle
2

Eine sehr detaillierte und analytische Diskussion zu diesem Thema finden Sie auf DIESER Seite

Es enthält die Beispielcodes und die Vor- und Nachteile verschiedener Optionen.

BiLaL
quelle
1
Sie sollten den Inhalt der in den Antworten angegebenen Links zusammenfassen. Andernfalls wird es als "Nur-Link-Antwort" bezeichnet und ist völlig nutzlos, wenn der Link verschwindet. In diesem Fall ist die Seite, auf die verwiesen wird,
insofern
0

Es gibt verschiedene Möglichkeiten, Kommentare in einer Batch-Datei abzugeben

1) Mit rem

Dies ist der offizielle Weg. Die Ausführung dauert anscheinend länger als ::, obwohl die Analyse anscheinend vorzeitig beendet wird, bevor die Carets verarbeitet werden. Die prozentuale Erweiterung erfolgt vor rem und ::wird identifiziert, sodass eine falsche prozentuale Nutzung %~Fehler verursacht, wenn Prozente vorhanden sind. Sicher überall in Codeblöcken zu verwenden.

2) Unter Verwendung von Etiketten :, ::oder :;usw.

Denn :: comment': comment' ist ein ungültiger Markenname, da er mit einem ungültigen Zeichen beginnt . Es ist jedoch in Ordnung, einen Doppelpunkt in der Mitte eines Etiketts zu verwenden. Wenn ein Leerzeichen am Anfang des Etiketts beginnt, wird es entfernt : labelwird :label. Wenn ein Raum oder ein Doppelpunkt in der Mitte des Etiketts erscheint, wird der Rest des Namens nicht interpretiert was bedeutet , dass , wenn es zwei Etiketten :f:oound :f rrwird sowohl als interpretiert werden :fund nur das später definierte Etikett in der Datei wird übersprungen werden. Der Rest des Etiketts ist praktisch ein Kommentar. Es gibt mehrere Alternativen zu den hier:: aufgeführten . Sie können nie oder ein Etikett. und wird nicht funktionieren.gotocall::foogoto :foogoto ::foo

Sie funktionieren auch außerhalb von Codeblöcken einwandfrei, aber nach einer ungültigen oder nicht ungültigen Beschriftung in einem Codeblock muss eine gültige Befehlszeile vorhanden sein. :: commentist in der Tat ein weiterer gültiger Befehl. Es interpretiert es als Befehl und nicht als Bezeichnung. Der Befehl hat Vorrang. Welches ist der Befehl, um auf das ::Volume zu cd , der funktioniert, wenn Sie ausgeführt haben subst :: C:\, sonst erhalten Sie einen kann den Volume-Fehler nicht finden. Das ist der Grund, warum :;es wohl besser ist, weil es nicht auf diese Weise interpretiert werden kann und daher stattdessen als Bezeichnung interpretiert wird, die als gültiger Befehl dient. Dies ist nicht rekursiv, dh das nächste Label benötigt keinen Befehl danach. Deshalb kommen sie zu zweit.

Sie müssen nach dem Etikett einen gültigen Befehl eingeben, z echo something. Eine Beschriftung in einem Codeblock muss mindestens einen gültigen Befehl enthalten, daher werden die Zeilen paarweise angezeigt. Sie erhalten einen unerwarteten )Fehler, wenn in der nächsten Zeile ein Leerzeichen oder eine schließende Klammer steht. Wenn zwischen den beiden ::Zeilen ein Leerzeichen steht , wird ein ungültiger Syntaxfehler angezeigt.

Sie können den Caret-Operator im ::Kommentar auch wie folgt verwenden:

@echo off

echo hello
(
   :;(^
   this^
   is^
   a^
   comment^
   )
   :;
)
   :;^
   this^
   is^
   a^
   comment
   :;
) 

Sie benötigen jedoch das Trailing :;aus dem oben genannten Grund.

@echo off

(
echo hello
:;
:; comment
:; comment
:;
)
echo hello

Es ist in Ordnung, solange es eine gerade Zahl gibt. Dies ist zweifellos der beste Weg, um zu kommentieren - mit 4 Zeilen und :;. Mit erhalten :;Sie keine Fehler, die mit 2> nuloder unterdrückt werden müssen subst :: C:\. Sie können verwenden subst :: C:\, um den nicht gefundenen Volume-Fehler zu beseitigen. Dies bedeutet jedoch, dass Sie auch C: in den Code einfügen müssen, um zu verhindern, dass Ihr Arbeitsverzeichnis wird ::\.

Um am Ende einer Zeile zu kommentieren, können Sie command &::oder command & rem comment, aber es muss immer noch eine gerade Zahl geben, wie folgt :

@echo off

(
echo hello & :;yes
echo hello & :;yes
:;
)

echo hello

Der erste echo hello & :;yeshat einen gültigen Befehl in der nächsten Zeile, der zweite & :;yesjedoch nicht. Daher benötigt er einen, dh den :;.

3) Verwenden einer ungültigen Umgebungsvariablen

%= comment =%. In einer Batchdatei werden Umgebungsvariablen, die nicht definiert sind, aus dem Skript entfernt. Dies ermöglicht es, sie am Ende einer Zeile ohne Verwendung zu verwenden &. Es ist üblich, eine ungültige Umgebungsvariable zu verwenden, dh eine, die ein Gleichheitszeichen enthält. Die zusätzliche Gleichheit ist nicht erforderlich, lässt sie jedoch symmetrisch aussehen. Variablennamen, die mit "=" beginnen, sind auch für nicht dokumentierte dynamische Variablen reserviert. Diese dynamischen Variablen enden nie mit "=". Wenn Sie also sowohl am Anfang als auch am Ende des Kommentars ein "=" verwenden, besteht keine Möglichkeit eines Namenskonflikts. Der Kommentar darf %oder nicht enthalten :.

@echo off 
echo This is an example of an %= Inline Comment =% in the middle of a line.

4) Als Befehl stderr nach nul umleiten

@echo off
(
echo hello
;this is a comment 2> nul
;this is another comment  2> nul
)

5) Am Ende einer Datei ist alles nach einer nicht geschlossenen Klammer ein Kommentar

@echo off
(
echo hello
)

(this is a comment
this is a comment
this is a comment
Lewis Kelsey
quelle