Piszę kilka plików wsadowych i natknąłem się na ten podręcznik użytkownika , który był dość pouczający. Jedną rzeczą, która mi pokazała, było to, że linie można komentować nie tylko za pomocą REM
, ale także za pomocą ::
. To mówi:
Komentarze w kodzie wsadowym można wprowadzać za pomocą dwukropka, jest to lepsze niż użycie polecenia REM, ponieważ etykiety są przetwarzane przed symbolami przekierowania.
::<remark>
nie powoduje problemów, alerem <remark>
powoduje błędy.
Dlaczego więc większość przewodników i przykładów, które widzę, używa REM
polecenia? Czy ::
działa na wszystkich wersjach systemu Windows?
batch-file
coding-style
comments
MikeFHay
źródło
źródło
command.exe
), a niecmd.exe
The NT Procesor poleceń, jak znaleźć w systemie Windows 2000 naprzód.rem <remark>
działa dobrze w tym drugim (od co najmniej Windows XP) iREM
jest oficjalnym rozwiązaniem i najbezpieczniejszym wyborem; choć::
ma swoje zalety, jest to ostatecznie hack, który jest problematyczny w(…)
blokach (jak omówiono w wielu odpowiedziach tutaj).Odpowiedzi:
tl; dr:
REM
to udokumentowany i obsługiwany sposób osadzania komentarzy w plikach wsadowych.::
jest w zasadzie pustą etykietą, do której nigdy nie można przejść, podczas gdyREM
jest to rzeczywiste polecenie, które nic nie robi. W żadnym przypadku (przynajmniej w systemie Windows 7) obecność operatorów przekierowań nie powoduje problemu.Jednak
::
wiadomo, że w pewnych okolicznościach źle się zachowuje w blokach, ponieważ jest analizowany nie jako etykieta, ale jako rodzaj litery dysku. Jestem trochę rozmyślany, gdzie dokładnie, ale to samo wystarczy, żebym używałREM
wyłącznie. Jest to udokumentowany i obsługiwany sposób osadzania komentarzy w plikach wsadowych, podczas gdy::
jest jedynie artefaktem określonej implementacji.Oto przykład, w którym
::
powstaje problem wFOR
pętli.Ten przykład nie działa w pliku o nazwie
test.bat
na pulpicie:Chociaż ten przykład będzie działał poprawnie jako komentarz:
Problem pojawia się podczas próby przekierowania danych wyjściowych do pliku. Domyślam się, że interpretuje to
::
jako etykietę ucieczki:echo
.źródło
%VAR%
zmienne są rozwijane. Załóżmy, że masz (błędnie)set TARGET=C:\Program Files (x86)\"foo.exe"
, a wewnątrzDO(..)
wyrażenia masz:: echo %TARGET%
błąd, ponieważ(x86)
rozszerza się, zanim całe wyrażenie zostanie ocenione, co prowadzi do niepoprawnegoDO(..)
wyrażenia i bardzo niewytłumaczalnych błędów (w tym przypadku „Microsoft był nieoczekiwany w tym czasie „ ). Nawet nie potrzebujesz|
ani>
w swojej ekspresji. A::
jednak nie jest prawdziwym komentarzemREM
.Komentarze z REM
A
REM
może zaznaczyć kompletną linię, także wieloliniowy karetkę na końcu linii, jeśli nie jest to koniec pierwszego tokena.REM, po którym następują niektóre znaki,
.:\/=
działa nieco inaczej, nie komentuje znaku handlowego i, więc możesz użyć go jako komentarza wbudowanego.Jednak, aby uniknąć problemów z istniejących plików, takich jak
REM
,REM.bat
czyREM;.bat
tylko należy stosować zmodyfikowany wariant.A dla postaci
;
jest również dozwolone jedno z;,:\/=
REM jest około 6 razy wolniejszy niż
::
(testowany na Win7SP1 z 100000 liniami komentarzy).W przypadku normalnego użytkowania nie jest to ważne (58µs vs. 360µs na linię komentarza)
Komentarze z ::
::
Zawsze wykonuje się daszka końcową linię.Etykiety, a także etykieta komentarza
::
mają specjalną logikę w blokach nawiasów.Obejmują one zawsze dwie linie SO: polecenie goto nie działa .
Dlatego nie są zalecane w przypadku bloków nawiasów, ponieważ często są przyczyną błędów składniowych.
Wyświetlana
ECHO ON
jestREM
linia, ale nie linia komentowana::
Oba nie mogą tak naprawdę komentować reszty linii, więc proste
%~
spowoduje błąd składniowy.Ale REM jest w stanie zatrzymać parser partii na wczesnym etapie, nawet przed zakończeniem fazy postaci specjalnej.
Możesz użyć & REM lub & ::, aby dodać komentarz na końcu wiersza poleceń. To podejście działa, ponieważ „&” wprowadza nowe polecenie w tym samym wierszu.
Komentarze ze znakami procentowymi% = komentarz =%
Istnieje styl komentarza ze znakami procentowymi.
W rzeczywistości są to zmienne, ale są rozszerzone do zera.
Ale zaletą jest to, że można je umieścić w tej samej linii, nawet bez
&
.Znak równości gwarantuje, że taka zmienna nie może istnieć.
Styl procentowy jest zalecany dla makr wsadowych, ponieważ nie zmienia zachowania środowiska wykonawczego, ponieważ komentarz zostanie usunięty po zdefiniowaniu makra.
źródło
%=
komentarze są kapryśne ze znakami cudzysłowu, tzn.set foo=bar %=baz
Skutkująfoo
rozszerzeniem dobar %=baz
, podobnie jakset foo="bar" %=baz
, podczas gdy tylkoset "foo=bar" %=baz
skutkiem jestfoo
rozwijanie dobar
zamierzonego.set "foo=bar"
, ponieważ jest to najbardziej niezawodna forma, która wyraźnie określa wartość. Kwestia jesteś opisujące tkwi wset
„s zachowanie, a nie specyficzne dla%= … =%
komentarzy: o ile nie korzystają"var=val"
cytowanie,set
uważa, że wszystko, co następuje po=
wartości, w tym końcowe białe znaki (do końca linii lub, w stosownych przypadkach, początek następne polecenie wbudowane).Inną alternatywą jest wyrażenie komentarza jako zmiennej, która zawsze rozwija się do zera.
Nazwy zmiennych nie mogą zawierać
=
, z wyjątkiem nieudokumentowanych zmiennych dynamicznych, takich jak%=ExitCode%
i%=C:%
. Żadna nazwa zmiennej nigdy nie może zawierać znaku=
po 1. pozycji. Dlatego czasami używam następujących elementów, aby dołączyć komentarze w bloku w nawiasach:Jest to również dobra metoda wprowadzania komentarzy w linii
Prowadzenie
=
nie jest konieczne, ale podoba mi się symetria.Istnieją dwa ograniczenia:
1) komentarz nie może zawierać
%
2) komentarz nie może zawierać
:
źródło
%=ExitCode%
? Schludny. Naucz się czegoś nowego każdego dnia!=
jest konieczne. Ale tak się nie wydaje.=
więc coś takiego jak% = ExitCode =% jest „komentarzem”, a nie zmienną dynamiczną. Wolę używać stylu, który zawsze działa (z wyjątkiem ograniczeń odnotowanych u dołu odpowiedzi).Po tym, jak zdałem sobie sprawę, że mogę używać etykiety
::
do komentowania i komentowania kodu,REM
wyglądało to dla mnie brzydko. Jak już wspomniano, dwukropek może powodować problemy, gdy jest używany w()
zablokowanym kodzie, ale odkryłem obejście, zmieniając etykiety::
i:
spaceTo nie jest brzydkie
REM
i faktycznie dodaje trochę stylu do twojego kodu.Więc poza blokami kodu używam
::
i wewnątrz nich na przemian::
i:
.Nawiasem mówiąc, w przypadku dużych fragmentów komentarzy, takich jak nagłówek pliku wsadowego, można całkowicie uniknąć specjalnych poleceń i znaków, po prostu umieszczając
goto
komentarze. To pozwala nam użyć dowolnej metody lub stylu znaczników, jaki chcesz, pomimo faktu, że gdybyCMD
kiedykolwiek próbował przetworzyć te linie, rzuciłby syk.Użyj dowolnej notacji, którą chcesz
*
,@
itp.źródło
/?
przełącznikiem, aby wydrukować to menu?:PrintHelp
) dla tej odpowiedzi, który rzeczywiście robi to, o co prosi @hoang. Używam <HELP> i </HELP> jako markerów, ale możesz użyć tego, co ci odpowiada.Ta odpowiedź jest próbą pragmatycznego podsumowania wielu świetnych odpowiedzi na tej stronie:
Świetna odpowiedź jeba zasługuje na specjalną wzmiankę, ponieważ naprawdę jest dogłębna i obejmuje wiele przypadków krawędzi.
W szczególności zwraca uwagę, że źle skonstruowane odwołanie do zmiennej / parametru, takie jak
%~
może złamać dowolne z poniższych rozwiązań - w tymREM
linie .Komentarze całej linii - jedyny bezpośrednio obsługiwany styl:
REM
(lub jego warianty) jest jedynym oficjalnym konstruktem komentarzy i jest najbezpieczniejszym wyborem - patrz pomocna odpowiedź Joeya .::
to (powszechnie stosowany) hack , który ma zalety i wady :Plusy :
Wady :
(...)
bloków::
można złamać polecenie , a zasady bezpiecznego użytkowania są restrykcyjne i trudne do zapamiętania - patrz poniżej.Jeśli nie chcesz używać
::
, masz te opcje:(...)
bloków i używaćREM
tam, czy nie należy umieszczać komentarzy wewnątrz(...)
całkowicie.::
wnętrza(...)
, które zostały streszczone w następującym fragmencie:Emulacja innych stylów komentarzy - liniowy i wieloliniowy:
Pamiętaj, że żaden z tych stylów nie jest bezpośrednio obsługiwany przez język wsadowy , ale można go emulować .
Komentarze wbudowane :
* Poniższe fragmenty kodu służą
ver
jako stand-in dla dowolnego polecenia, aby ułatwić eksperymentowanie.* Aby
SET
polecenia działały poprawnie z wbudowanymi komentarzami, dwukrotnie cudzysłówname=value
; npSET "foo=bar"
. [1]W tym kontekście możemy wyróżnić dwa podtypy:
Komentarze EOL ([do-końca] wiersza), które można umieścić po poleceniu i niezmiennie rozciągają się na koniec wiersza (ponownie, dzięki uprzejmości odpowiedzi jeba ):
ver & REM <comment>
wykorzystuje fakt, żeREM
jest to poprawne polecenie i&
może być użyte do umieszczenia dodatkowego polecenia po istniejącym.ver & :: <comment>
działa również, ale tak naprawdę można go używać tylko poza(...)
blokami , ponieważ jego bezpieczne użycie jest jeszcze bardziej ograniczone niż używanie::
samodzielne.Komentarze wewnątrz wiersza , które można umieszczać między wieloma poleceniami w wierszu lub idealnie nawet wewnątrz danego polecenia.
Komentarze wewnątrz wiersza są najbardziej elastyczną (jednowierszową) formą i mogą z definicji być również używane jako komentarze EOL.
ver & REM^. ^<comment^> & ver
pozwala na wstawienie komentarza między poleceniami (ponownie, dzięki uprzejmości odpowiedzi jeba ), ale zwróć uwagę, jak<
i>
trzeba było^
przeskalować, ponieważ następujące znaki. nie można używać w stanie „tak jak jest”:< > |
(podczas gdy nieskalowane&
lub&&
lub||
uruchomić następną komendę).%= <comment> =%
, jak opisano w świetnej odpowiedzi dbenham , jest najbardziej elastyczną formą , ponieważ można ją umieścić w poleceniu (wśród argumentów) .Korzysta ze składni rozszerzania zmiennych w sposób, który zapewnia, że wyrażenie zawsze rozwija się do pustego łańcucha - tak długo, jak tekst komentarza nie zawiera
%
ani „:
Like”
REM
,%= <comment> =%
działa dobrze zarówno na zewnątrz, jak i wewnątrz(...)
bloków, ale jest bardziej wyrazisty; jedyną wadą jest to, że trudniej jest pisać, łatwiej jest popełnić błąd składniowy i nie jest to powszechnie znane, co może utrudniać zrozumienie kodu źródłowego używającego tej techniki.Komentarze do wielu linii (blok całej linii) :
Odpowiedź Jamesa K pokazuje, jak używać
goto
oświadczenia i etykiety do określenia wieloliniowego komentarza o dowolnej długości i treści (który w jego przypadku wykorzystuje do przechowywania informacji o użytkowaniu).Odpowiedź Zee pokazuje, jak używać „etykiety zerowej”, aby utworzyć komentarz wielowierszowy, chociaż należy zachować ostrożność, aby zakończyć wszystkie linie wewnętrzne
^
.Rob van der Woude na blogu wspomina inny nieco niejasne opcję, która pozwala zakończyć plik z dowolnej liczby linii komentarza : AN otwarcie
(
tylko powoduje wszystko, co przychodzi po które mają być ignorowane , o ile nie zawierają (nie^
-scaped))
, tzn. dopóki blok nie jest zamknięty .[1] Używanie
SET "foo=bar"
do definiowania zmiennych - tj. Umieszczanie podwójnych cudzysłowów wokół nazwy i połączonej=
wartości - jest konieczne w poleceniach takich , aby zapewnić, że to, co następuje po zamierzonej wartości zmiennej (w tym przypadku do następnego polecenia) pojedyncza spacja) nie przypadkowo staje się jej częścią. (Nawiasem mówiąc : nie tylko nie uniknie problemu, ale sprawi, że podwójne cudzysłowy będą częścią wartości ). Zauważ, że ten problem jest nieodłączny, a nawet dotyczy przypadkowych spacji końcowych po wartości, dlatego zaleca się, aby zawsze stosować to podejście.SET "foo=bar" & REM Set foo to bar.
SET foo="bar"
SET
SET "foo=bar"
źródło
Ta strona mówi, że użycie „::” będzie szybsze pod pewnymi ograniczeniami. Tylko jedną rzecz do rozważenia przy wyborze
źródło
::
może być 6 razy szybsza niżREM
dobre pytanie ... zbyt długo szukałem tej funkcjonalności ...
po kilku testach i sztuczkach wydaje się, że lepszym rozwiązaniem jest bardziej oczywiste ...
-> najlepszym sposobem, jaki znalazłem, aby to zrobić, zapobiegając awarii integralności parsera, jest ponowne użycie REM:
możesz także użyć multilinii ze sztuczką „NULL LABEL” ... (nie zapomnij o ^ na końcu linii dla zachowania ciągłości)
źródło
James K, przepraszam, że się myliłem w sporej części tego, co powiedziałem. Test, który wykonałem, był następujący:
Spełnia to opis naprzemiennego, ale kończy się niepowodzeniem, gdy „) było w tej chwili nieoczekiwane”. Komunikat o błędzie.
Dzisiaj przeprowadziłem kilka testów i okazało się, że naprzemienne nie jest kluczem, ale wygląda na to, że klucz ma parzystą liczbę wierszy, nie ma żadnych dwóch wierszy z rzędu, zaczynając od podwójnych dwukropków (: :) i nie kończąc na podwójnych dwukropkach . Rozważ następujące:
To działa!
Ale również weź to pod uwagę:
Wydaje się, że zasada kończenia polecenia na parzystej liczbie komentarzy nie ma zastosowania.
Niestety jest to wystarczająco wiewiórcze, że nie jestem pewien, czy chcę go użyć.
Naprawdę najlepszym rozwiązaniem i najbezpieczniejszym, o jakim mogę myśleć, jest to, że program taki jak Notepad ++ odczytuje REM jako podwójne dwukropki, a następnie zapisuje podwójne dwukropki jako instrukcje REM po zapisaniu pliku. Ale nie znam takiego programu i nie znam żadnych wtyczek do Notepad ++, które to robią.
źródło
Bardzo szczegółowa i analityczna dyskusja na ten temat dostępna jest na TEJ stronie
Ma przykładowe kody i zalety / wady różnych opcji.
źródło
Istnieje wiele sposobów komentowania w pliku wsadowym
1) Korzystanie z rem
To jest oficjalny sposób. Najwyraźniej trwa dłużej niż
::
, choć najwyraźniej przestaje się analizować wcześniej, zanim zostaną przetworzone instrukcje. Wzrost procentowy następuje przed rem i::
jest identyfikowany, więc nieprawidłowe użycie procentowe, tj.%~
Spowoduje błędy, jeśli procent będzie obecny. Bezpieczny w użyciu w dowolnym miejscu w blokach kodu.2) Za pomocą etykiet
:
,::
lub:;
etc.Ponieważ
:: comment
„: komentarz” jest nieprawidłową nazwą etykiety, ponieważ zaczyna się od niepoprawnego znaku. Można jednak używać dwukropka na środku etykiety. Jeśli przestrzeń zaczyna się na początku etykiecie, jest on usuwany: label
staje:label
. Jeśli na środku etykiety pojawi się spacja lub dwukropek, reszta nazwy nie zostanie zinterpretowana, co oznacza, że jeśli istnieją dwie etykiety:f:oo
i:f rr
obie zostaną zinterpretowane jako:f
i tylko do później zdefiniowanej etykiety w pliku zostanie przeniesiona. Reszta etykiety jest faktycznie komentarzem. Istnieje wiele alternatyw::
, wymienionych tutaj . Nigdy nie możnagoto
lub etykieta. i nie będzie działać.call
::foo
goto :foo
goto ::foo
Działają dobrze poza blokami kodu, ale po etykiecie w bloku kodu, niepoprawnej lub nie, musi istnieć poprawny wiersz polecenia.
:: comment
jest rzeczywiście innym ważnym poleceniem. Interpretuje to jako polecenie, a nie etykietę; polecenie ma pierwszeństwo. Które jest poleceniem cd do::
woluminu, który zadziała, jeśli wykonałeśsubst :: C:\
, w przeciwnym razie nie będzie można znaleźć błędu woluminu. Dlatego:;
jest prawdopodobnie lepszy, ponieważ nie można go interpretować w ten sposób, a zatem jest interpretowany jako etykieta, która służy jako prawidłowe polecenie. Nie jest to rekurencyjne, tzn. Następna etykieta nie wymaga polecenia po niej. Dlatego przychodzą dwójkami.Musisz podać prawidłowe polecenie po etykiecie, np
echo something
. Etykieta w bloku kodu musi zawierać co najmniej jedno prawidłowe polecenie, więc linie występują w parach po dwie. Otrzymasz nieoczekiwany)
błąd, jeśli w następnym wierszu znajduje się spacja lub nawias zamykający. Jeśli między dwiema::
liniami jest spacja , pojawi się nieprawidłowy błąd składniowy.Możesz także użyć operatora karetki w
::
komentarzu w następujący sposób:Ale potrzebujesz podążania
:;
z podanego powyżej powodu.Jest w porządku, o ile jest parzysta liczba. Jest to bez wątpienia najlepszy sposób komentowania - z 4 liniami i
:;
. Ze:;
nie dostaniesz wszelkie błędy, które muszą być tłumione za pomocą2> nul
lubsubst :: C:\
. Możesz użyć,subst :: C:\
aby błąd nie znaleziono woluminu zniknął, ale oznacza to, że będziesz musiał również wstawić C: w kodzie, aby zapobiec zmianie katalogu roboczego::\
.Do komentarza na końcu wiersza można zrobić,
command &::
albocommand & rem comment
, ale wciąż musi być numer nawet, tak jak poniżej:Pierwszy
echo hello & :;yes
ma prawidłowe polecenie w następnym wierszu, ale drugi& :;yes
nie, więc potrzebuje jednego, tj:;
.3) Używanie niepoprawnej zmiennej środowiskowej
%= comment =%
. W pliku wsadowym niezdefiniowane zmienne środowiskowe są usuwane ze skryptu. Umożliwia to używanie ich na końcu linii bez użycia&
. Zwyczajowo używa się niepoprawnej zmiennej środowiskowej, tj. Zawierającej znak równości. Dodatkowa równość nie jest wymagana, ale sprawia, że wygląda symetrycznie. Ponadto nazwy zmiennych rozpoczynające się od „=” są zarezerwowane dla nieudokumentowanych zmiennych dynamicznych. Te zmienne dynamiczne nigdy nie kończą się na „=”, więc używając „=” zarówno na początku, jak i na końcu komentarza, nie ma możliwości kolizji nazw. Komentarz nie może zawierać%
lub:
.4) Jako polecenie przekierowuję stderr na nul
5) Na końcu pliku wszystko po niezamkniętym nawiasie jest komentarzem
źródło