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 REM
Befehl? Funktioniert ::
unter allen Windows-Versionen?
batch-file
coding-style
comments
MikeFHay
quelle
quelle
command.exe
), nicht aufcmd.exe
den NT- Befehlsprozessor, wie er unter Windows 2000 verfügbar ist.rem <remark>
funktioniert in letzterem einwandfrei (seit mindestens Windows XP) undREM
ist 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).Antworten:
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ährendREM
es 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 michREM
ausschließ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 einerFOR
Schleife auftritt.Dieses Beispiel funktioniert nicht in einer Datei, die
test.bat
auf Ihrem Desktop aufgerufen wird :Während dieses Beispiel als Kommentar korrekt funktioniert:
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
.quelle
%VAR%
Variablen erweitert. Angenommen, Sie haben (falsch)set TARGET=C:\Program Files (x86)\"foo.exe"
und in einemDO(..)
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ültigenDO(..)
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 KommentarREM
.Kommentare mit REM
A
REM
kann eine vollständige Zeile, auch ein mehrzeiliges Caret am Zeilenende, bemerken, wenn es nicht das Ende des ersten Tokens ist.REM gefolgt von einigen Zeichen
.:\/=
funktioniert etwas anders. Es wird kein kaufmännisches Und kommentiert, sodass Sie es als Inline-Kommentar verwenden können.Um jedoch Probleme mit vorhandenen Dateien zu vermeiden
REM
, sollteREM.bat
oderREM;.bat
nur eine modifizierte Variante verwendet werden.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.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 ON
eineREM
Zeile angezeigt, jedoch keine kommentierte Zeile::
Beide können den Rest der Zeile nicht wirklich auskommentieren, so dass ein einfacher
%~
einen Syntaxfehler verursacht.REM kann den Batch-Parser jedoch frühzeitig stoppen, noch bevor die Sonderzeichenphase abgeschlossen ist.
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.
Der Prozentstil wird für Stapelmakros empfohlen, da er das Laufzeitverhalten nicht ändert, da der Kommentar entfernt wird, wenn das Makro definiert wird.
quelle
%=
Kommentare mit Anführungszeichen pingelig sind, dhset foo=bar %=baz
zu einerfoo
Erweiterung auf führenbar %=baz
, wie dies der Fall istset foo="bar" %=baz
, während dies nurset "foo=bar" %=baz
zu einerfoo
Erweiterung aufbar
wie beabsichtigt führt.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ärentenset
‚s Verhalten und nicht spezifisch für%= … =%
Kommentare: es sei denn , Sie verwenden"var=val"
zitiert,set
hä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).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:Es ist auch eine gute Methode zum Einfügen von Inline-Kommentaren
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
:
quelle
%=ExitCode%
? Ordentlich. Lerne jeden Tag etwas Neues!=
notwendig ist. Aber es scheint nicht so zu sein.=
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).Nachdem mir klar wurde, dass ich mit dem Label
::
Kommentare abgeben und CodeREM
auskommentieren 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:
spaceEs ist nicht hässlich
REM
und 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
goto
Ihre Kommentare überschreiben. Auf diese Weise können Sie jede gewünschte Methode oder jeden gewünschten Markup-Stil verwenden, obwohl dies, wenn SieCMD
jemals tatsächlich versuchen würden, diese Zeilen zu verarbeiten, ein Rauschen auslösen würde.Verwenden Sie, was jemals Notation Sie wollen
*
‚s,@
‘ s usw.quelle
/?
Schalter um, damit er dieses Menü druckt?: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.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ßlichREM
Zeilen - 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 :
(...)
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:(...)
Blöcken und verwenden Sie sieREM
dort, oder platzieren Sie keine Kommentare darin(...)
.::
Innenräumen(...)
, die im folgenden Ausschnitt zusammengefasst sind: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
ver
für einen beliebigen Befehl verwendet, um das Experimentieren zu erleichtern.* Damit
SET
Befehle mit Inline-Kommentaren ordnungsgemäß funktionieren, zitieren Sie dasname=value
Teil 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, dassREM
es 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^> & ver
Ermö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ält
REM
,%= <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
goto
Anweisung 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 erforderlichSET "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
SET
und sogar für versehentlich nachgestellte Leerzeichen nach dem Wert gilt. Daher ist es ratsam, immer denSET "foo=bar"
Ansatz zu verwenden.quelle
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
quelle
::
kann 6-mal schneller sein alsREM
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:
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.)
quelle
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:
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:
Das funktioniert!
Aber bedenken Sie auch Folgendes:
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.
quelle
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.
quelle
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: label
wird: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:oo
und:f rr
wird sowohl als interpretiert werden:f
und 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.goto
call
::foo
goto :foo
goto ::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.
:: comment
ist 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 habensubst :: 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:Sie benötigen jedoch das Trailing
:;
aus dem oben genannten Grund.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 mit2> nul
oder unterdrückt werden müssensubst :: C:\
. Sie können verwendensubst :: 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 &::
odercommand & rem comment
, aber es muss immer noch eine gerade Zahl geben, wie folgt :Der erste
echo hello & :;yes
hat einen gültigen Befehl in der nächsten Zeile, der zweite& :;yes
jedoch 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:
.4) Als Befehl stderr nach nul umleiten
5) Am Ende einer Datei ist alles nach einer nicht geschlossenen Klammer ein Kommentar
quelle