Jak „skomentować” (dodać komentarz) w partii / cmd?


881

Mam plik wsadowy, który uruchamia kilka skryptów Python wykonujących modyfikacje tabeli.

  1. Chcę, aby użytkownicy komentowali skrypty 1-2 Pythona, których nie chcą uruchamiać, zamiast usuwać je z pliku wsadowego (aby następny użytkownik wiedział, że te skrypty istnieją jako opcje!)

  2. Chcę również dodać komentarze, aby zwrócić ich uwagę, w szczególności zmienne, które muszą zaktualizować w pliku wsadowym przed jego uruchomieniem. Widzę, że mogę użyć REM. Ale wygląda na to, że to więcej w przypadku aktualizacji użytkownika z postępem po jego uruchomieniu.

Czy istnieje składnia umożliwiająca bardziej odpowiednie dodawanie komentarza?


6
Zobacz także doskonałe odpowiedzi tutaj stackoverflow.com/q/12407800/1011025
ndemou

2
Możesz użyć Rem Sthpolecenia lub użyć tego znaku::: Sth
scientist_7

Odpowiedzi:


879

remPolecenie jest rzeczywiście dla komentarzy. Z natury nie aktualizuje nikogo po uruchomieniu skryptu. Niektórzy autorzy skryptów mogą jednak używać go w ten sposób echo, ponieważ domyślnie interpreter wsadowy wypisuje każde polecenie przed jego przetworzeniem. Ponieważ rempolecenia nic nie robią, można je bezpiecznie drukować bez skutków ubocznych. Aby uniknąć drukowania polecenia, poprzedź je znakiem @lub, aby zastosować to ustawienie w całym programie, uruchom @echo off. (Ma to na echo offcelu uniknięcie drukowania kolejnych poleceń; @ma to na celu uniknięcie drukowania tego polecenia przed wprowadzeniem ustawienia echa).

Tak więc w pliku wsadowym możesz użyć tego:

@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py

405
możesz także użyć dwóch dwukropków „::”. Jest to jeden z dwóch sposobów dodawania uwag do pliku wsadowego bez wyświetlania lub wykonywania tej linii po uruchomieniu pliku wsadowego. W przeciwieństwie do REM ten wiersz nie będzie wyświetlany, niezależnie od tego, czy ECHO jest wyłączone w pliku wsadowym.
Brent81,

12
@ Brent81 Uważam, że to powinna być poprawna odpowiedź. Podczas używania podświetlania składni polecenie REM nie podświetla tekstu jako „skomentowane”.
Automatico

17
Dwukropek to „nieprawidłowa etykieta”; oto artykuł, który to wyjaśnia i dlaczego jego wydajność może być lepsza niż REM (szczególnie na dyskietkach!) i nie będzie działać w wciętych blokach kodu (tylko na pierwszym znaku): robvanderwoude.com/comments.php
Michael Paulukonis,

4
Ciekawy. Myślałem, że REM był „komentarzem całej linii”, a dwukropek był „komentarzem liniowym”, jakREM This whole line is a comment @echo off :: This comment is inline
Richard Smith,

@Alhadis, skrypt konfiguracyjny Perla jest napisany w powłoce Bourne'a, a nie w pakiecie Windows, więc w jaki sposób ma on znaczenie tutaj? Co więcej, polecenie dwukropka będące poprawną składnią Bourne'a nie jest „dodatkowym efektem ubocznym”; właśnie dlatego jest używany w tym skrypcie Bourne'a . Jest używany na korzyść #komentarzy, ponieważ #najwyraźniej może nie być prawidłowym desygnatorem komentarza we wszystkich powłokach, które program Configure ma obsługiwać; patrz linia 3.
Rob Kennedy

955

Użyj ::lubREM

::   commenttttttttttt
REM  commenttttttttttt

ALE (jak ludzie zauważyli):

  • Jeśli używasz inline, musisz dodać &znak:
    your commands here & :: commenttttttttttt
  • Wewnątrz zagnieżdżonej logiki ( IF/ELSE, FORpętli itp.) Użyj, REMponieważ ::daje błąd.
  • :: może zawieść w ciągu setlocal ENABLEDELAYEDEXPANSION

79
Podwójny dwukropek :: To najczystszy dostępny komentarz .bat. I może być używany na początku lub na środku linii!
ATSiem

10
Nie działało dla mnie, gdy wykonano to w ten sposób. cd "C:\Folder" ::this throws a syntax error
Shaun Rowan

3
Również kończy się niepowodzeniem, git add :: blah this is not a commentgdy „fatal: pathspec 'blah” nie pasuje do żadnych plików ”
Bob Stein

19
Aby komentarz w tym samym wierszu, co pokazano w przykładzie, musisz dodać &kod i komentarz ::. Aby to zilustrować, otwórz polecenie cmd i uruchom polecenie, dir ::blahktóre nie wyświetla zawartości .i nie porównuje z nim dir & ::blah, co robi
Rado,

19
Ostrzeżenie, używanie ::będzie skryptów błędów z setlocal ENABLEDELAYEDEXPANSIONifor
Azevedo

50

Nie, zwykłe stare pliki wsadowe używają REMjako komentarza. ECHOto polecenie, które drukuje coś na ekranie.

Aby „skomentować” sekcje pliku, których możesz użyć GOTO. Przykład wszystkich tych poleceń / technik:

REM it starts here the section below can be safely erased once the file is customised
ECHO Hey you need to edit this file before running it!  Check the instructions inside
ECHO Now press ctrl-c to interrupt execution or enter to continue
PAUSE
REM erase the section above once you have customised the file
python executed1.py
ECHO Skipping some stuff now
GOTO End
python skipped1.py
python skipped2.py
:END
python executed2.py

Co mogę powiedzieć? pliki wsadowe są reliktem dawno minionych czasów, są niezgrabne i brzydkie.

Możesz przeczytać więcej na tej stronie .

EDYCJA: zmodyfikowałem nieco przykład, aby zawierał elementy, których najwyraźniej szukasz.


31

:: zamiast REM najlepiej było używać w czasach, gdy komputery nie były bardzo szybkie. REM'ed linii są czytane, a następnie wprowadzane. :: 'ed linia jest całkowicie ignorowana. To może przyspieszyć twój kod w „dawnych czasach”. Ponadto po REM potrzebujesz spacji, po :: nie.

I jak powiedziano w pierwszym komentarzu: możesz dodać informacje do dowolnej linii, w której czujesz taką potrzebę

SET DATETIME=%DTS:~0,8%-%DTS:~8,6% ::Makes YYYYMMDD-HHMMSS

Jeśli chodzi o pomijanie części. Stawianie REM przed każdą linią może być czasochłonne. Jak wspomniano, używanie GOTO do pomijania części jest łatwym sposobem na pomijanie dużych fragmentów kodu. Pamiętaj, aby ustawić: LABEL w punkcie, w którym chcesz kontynuować kod.

SOME CODE

GOTO LABEL  ::REM OUT THIS LINE TO EXECUTE THE CODE BETWEEN THIS GOTO AND :LABEL

SOME CODE TO SKIP
.
LAST LINE OF CODE TO SKIP

:LABEL
CODE TO EXECUTE

1
Jak można zignorować linię dwukropka bez czytania? Czy tłumacz nie musi najpierw przeczytać linii, zanim rozpozna ją jako linię dwukropka?
Rob Kennedy,

2
@RobKennedy, gdy czytam odpowiedź, nic nie czyta po ::, gdzie wszystko po REM jest czytane.
James Jenkins,

5
Jeśli interpreter poleceń przestanie czytać @James, to nigdy nie wykona więcej pliku. Oczywiście należy kontynuować czytanie, aby dowiedzieć się, gdzie kończy się komentarz i gdzie zaczyna się następny wiersz pliku. Ma to zrobić z ::i remrówno.
Rob Kennedy

2
@RobKennedy, myślałem również, że sugerowano, że dotyczy tylko linii, na której było polecenie.
James Jenkins,

7
@RobKennedy to czyta, ale nie analizuje (ani nie przetwarza) tego, co czyta, po prostu przeskakuje do następnego, \na następnie zaczyna ponownie analizować [potrzebne źródło]
xDaizu

25

Komentarze wieloliniowe

Jeśli istnieje duża liczba linii, które chcesz skomentować, lepiej będzie, jeśli będziesz mógł komentować wiele linii zamiast komentować każdą linię.

Zobacz ten post Roba van der Woude na temat bloków komentarzy :

Język wsadowy nie ma bloków komentarzy, choć istnieją sposoby na osiągnięcie tego efektu.

GOTO EndComment1
This line is comment.
And so is this line.
And this one...
:EndComment1

Do GOTOdodawania komentarzy do bloków można użyć opcji Etykieta i: Etykieta.

Lub, jeśli blok komentarza pojawia się na końcu pliku wsadowego, możesz napisać EXITna końcu kodu, a następnie dowolną liczbę komentarzy do zrozumienia.

@ECHO OFF
REM Do something
  •
  •
REM End of code; use GOTO:EOF instead of EXIT for Windows NT and later
EXIT

Start of comment block at end of batch file
This line is comment.
And so is this line.
And this one...

jest to często używane w hybrydowych skryptach wsadowych i VBS / JS, chociaż stosowano je, jeśli ifzamiast goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
phuclv

13

Umieszczanie komentarzy w tym samym wierszu za pomocą poleceń: użyj & :: comment

color C          & :: set red font color
echo IMPORTANT INFORMATION
color            & :: reset the color to default

Wyjaśnienie:

&rozdziela dwa polecenia , więc w tym przypadku color Cjest to pierwsze polecenie i :: set red font colordrugie.


Ważny:

To stwierdzenie z komentarzem wygląda intuicyjnie poprawnie:

goto error1         :: handling the error

ale to nie jest poprawne użycie komentarza. Działa tylko dlatego, że gotoignoruje wszystkie argumenty za pierwszym. Dowód jest prosty, to też gotonie zawiedzie:

goto error1 handling the error

Ale podobna próba

color 17            :: grey on blue

nie wykonaniem polecenia ze względu na nieznaną 4 argumenty do colorpolecenia: ::, grey, on, blue.

Będzie działać tylko jako:

color 17     &      :: grey on blue

Tak więc ampersand jest nieunikniony.


Z innych odpowiedzi wydaje się, że ampersand nie jest potrzebny?
RoG

3
@Snaptastic - Inne odpowiedzi są w tym momencie błędne, zobacz moją ostatnią edycję.
miroxlav

Wydaje się, że jest to właściwy sposób; Jest nawet podświetlony jako komentarz w moim IDE.
baburao

5

Możesz skomentować coś za pomocą ::lub REM:

your commands here
:: commenttttttttttt

lub

your commands here
REM  commenttttttttttt

 

Aby to zrobić w tym samym wierszu co polecenie, musisz dodać znak ampersand:

your commands here      & ::  commenttttttttttt

lub

your commands here      & REM  commenttttttttttt

 

Uwaga:

  • Korzystanie :: z zagnieżdżonych logiki ( IF-ELSE, FORpętle, itp ...) spowoduje błąd. W takich przypadkach użyj REMzamiast tego.

Jest to oparte na odpowiedzi T.Todui. Czułem, że ich odpowiedź była dobra, ale pominęłem kilka ważnych szczegółów, ale wycofali moją edycję, więc zmieniam moją wersję na własną odpowiedź.
Pikamander2

Pikamander2, twoja wersja (również wskazana przez użytkownika @Rado została połączona w odpowiedzi w tym czasie i dzięki za to, po prostu wolałem inną stylizację dla odpowiedzi i użyłem innej stylizacji.
T.Todua

1

To jest stary temat i chciałbym tutaj dodać moje zrozumienie, aby poszerzyć wiedzę na temat tego interesującego tematu.

Kluczowa różnica między REM a :: to:

REM to samo polecenie, podczas gdy :: NIE jest.

Możemy traktować :: jako token, który, gdy tylko parser CMD napotka pierwszą niepustą spację w linii, to :: token, po prostu pominie całą linię i przeczyta następną linię. Dlatego po REM powinien znajdować się co najmniej pusty spacja, aby mógł funkcjonować jako komentarz do linii, podczas gdy :: nie potrzebuje za nim spacji.

To, że REM jest poleceniem, można najlepiej zrozumieć na podstawie następującej składni FOR

Podstawowa składnia FOR jest następująca

FOR %v in (set) DO <Command> [command param] 

tutaj <Command>może być dowolne prawidłowe polecenie. Możemy więc napisać następujący prawidłowy wiersz polecenia, tak jak rempolecenie

FOR %i in (1,2,3) DO rem echo %i

Nie możemy jednak napisać następującego wiersza, ponieważ ::nie jest to polecenie

FOR %i in (1,2,3) DO :: echo %i

3
technicznie, ::to (nieprawidłowa) etykieta (która wyjaśnia jej zachowanie) i dlatego nie należy jej używać (chociaż nadal jest dość powszechna)
Stephan

1

Możesz dodać komentarze na końcu pliku wsadowego za pomocą następującej składni:

@echo off
:: Start of code
...
:: End of code

(I am a comment
So I am!
This can be only at the end of batch files

Tylko upewnij się, że nigdy nie używasz zamykających nawiasów.

Uznanie autorstwa: Leo Guttirez Ramirez na https://www.robvanderwoude.com/comments.php

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.