2011-12-15 22 views
66

Napisałem ogromny plik wsadowy MS DOS. Aby przetestować ten plik wsadowy, muszę wykonać tylko niektóre linie i chcieć ukryć/skomentować pozostałe.Komentowanie wielu linii w pliku wsadowym DOS

Mam kilka linii komentarza rozpoczynających się od :: dlatego nie mogę już używać :: ponieważ spowoduje to wstawienie wszystkich komentarzy.

Każda pomoc w tym zakresie zostanie doceniona. Z góry dziękuję, Jay

Odpowiedz

129

Możesz użyć numeru goto, aby pominąć kod.

goto comment 
...skip this... 
:comment 
+0

Dziękuję sir! – user219628

+5

+1: Zabawne jest używanie "goto" do tego i działa! –

+0

Myślę, że to zabawne, że nie ma prawdziwej definicji komentarza w linii poleceń, po prostu nie mogę zaakceptować linii 'REM' jako linii komentarza, sprawia, że ​​wynik jest niejasny – mkb

-1

spróbuj tego:

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

    ben ali 
    mubarak 
    gadeffi 
    ..next ? 

    echo hello Tunisia 

    pause 
+0

+1, ale dlaczego to działa? I po użyciu tego, stderr wydaje się być niedostępny – jeb

+1

-1, To "działa", ponieważ echo 2> Nul przekierowuje standardowy strumień błędów do NUL, grzebiąc go (3> Nul, 4> Nul przekierowują strumienie pomocnicze na nie prawdziwy powód). Nie powoduje to komentowania linii, a jedynie zapobiega wyświetlaniu komunikatów o błędach. Zatem wszystko, co można zinterpretować jako linie poleceń, będzie nadal działać. – pdubs

+3

Komentarz do pdubs jest częściowo poprawny, ponieważ komendy wciąż są wykonywane (i kończą się niepowodzeniem, ponieważ nie są prawidłowe). Ale prawidłowe polecenia będą wykonywane bez awarii. To nie jest dobre rozwiązanie do komentowania linii kodu. Wyjaśnienie, dlaczego strumień 2 (stderr) jest "trwale" wyłączony, jest nieprawidłowe. – dbenham

0

@jeb

A po użyciu tego, stderr wydaje się być niedostępne

Nie, spróbuj tego:

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

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

    echo hello Tunisia 

    pause 

Ale dlaczego to działa?

Przykro mi odpowiedzieć na pytanie w frensh:

(La przekierowania par 3> est Specjalny samochód elle persiste na va l'utiliser wlać Capturer le flux des erreurs 2> est on va le transformatora en un flux persistant à l'ade de 3> ceci va nous to unikatowy gest, który może być użyty w środowisku skryptu ... na przykład w repozytorium le lex 'stderr' il faut faire une autre redirection du handle 2 > au uchwyt 1> qui n'est que la autre konsola ..)

+1

Nie mogę czytać po francusku, ale nie wygląda to tak, jak adres 2 (stderr) jest nadal wyłączane po zakończeniu początkowego przekierowania. Mam praktyczną teorię i przypadki testowe w 2 kolejnych wpisach na http://www.dostips.com/forum/viewtopic.php?p=14612#p14612. – dbenham

+0

(Przekierowanie przez 3> jest wyjątkowe, ponieważ nie zniknie, użyjemy go do przechwycenia przepływu błędów 2> spowoduje przekształcenie go w trwały przepływ do 3> umożliwi nam to błąd zarządzania dla dowolnego z nasz skrypt środowiska. Jeśli chcesz odzyskać przepływ "stderr", musimy wykonać inne przekierowanie 2>, aby obsłużyć>, który jest niczym innym niż konsolą ..) – user96403

9

Inną opcją jest załączenie niechcianych linii w bloku jeśli to nie może być prawda

if 1==0 (
... 
) 

Oczywiście nic w obrębie bloku if nie zostanie wykonane, ale zostanie przeanalizowane. Więc nie możesz mieć żadnej nieważnej składni wewnątrz. Ponadto komentarz nie może zawierać ), chyba że jest unikany lub cytowany. Z tych powodów przyjęte rozwiązanie GOTO jest bardziej niezawodne. (Rozwiązanie GOTO może również być szybciej)

Aktualizacja 2017-09-19

Oto kosmetyczny akcesorium do pdub's GOTO solution. Definiuję prostą zmienną środowiskową "makro", która sprawia, że ​​składnia komentarza GOTO jest nieco lepsza do samodzielnego dokumentowania. Chociaż ogólnie zaleca się, aby: etykiety były unikalne w skrypcie wsadowym, to naprawdę dobrze jest osadzić wiele takich komentarzy w tym samym skrypcie wsadowym.

@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 

Lub możesz użyć jednego z tych wariantów npocmaka's solution. Użycie funkcji REM zamiast BREAK sprawia, że ​​intencje są nieco jaśniejsze.

rem.||(
    remarks 
    go here 
) 

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

Jeśli chcesz dodać REM na początku każdej linii, zamiast używać Goto, można użyć Notepad ++ to zrobić łatwo następujące kroki:

  1. wybrać blok wierszy
  2. Ctrl-Q

Powtórz kroki odkomentowac

+3

Dobra wskazówka. czyni to znacznie czystszym. – Venom

+0

Wow, nie wiedziałem, że w Notatniku ++ jest taka fajna funkcja! Właściwie to naprawdę tęskniłem, ponieważ jestem przyzwyczajony do 'Ctrl + 7 'w Eclipse. Zagłosowano do ** 42 **;) –

+0

Co z odkomentowaniem. Tam jest skrót do odkomentowania całego bloku. –

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

Podczas gdy rozwiązanie goto jest dobrym rozwiązaniem, nie będzie działać within brackets (w tym polecenia FOR i IF). Ale to będzie. Chociaż należy zachować ostrożność podczas zamykania nawiasów i niepoprawnej składni dla poleceń FOR i IF, ponieważ zostaną one przeanalizowane.

Aktualizacja

Aktualizacja w dbenham's odpowiedź dał mi kilka pomysłów. Po pierwsze - są dwa różne przypadki, w których możemy potrzebować komentarzy wielowierszowych - w kontekście nawiasu, w którym nie można użyć GOTO i poza nim. Kontekst nawiasów wewnętrznych można użyć w nawiasach, jeśli istnieje warunek uniemożliwiający wykonanie kodu. Mimo że kod nadal będzie analizowany , wykryte zostaną błędy składniowe (FOR, IF, niewłaściwie zamknięte nawiasy, nieprawidłowe rozszerzenie parametrów. .) Jeśli więc jest to możliwe, lepiej użyć GOTO. Chociaż nie jest możliwe utworzenie makra/zmiennej używanej jako etykieta - ale możliwe jest użycie makr do komentarzy do nawiasów. Można użyć dwóch trików, aby GOTO komentarze były bardziej symetryczne i przyjemniejsze (przynajmniej dla mnie). Do tego użyję dwóch trików - 1) możesz umieścić pojedynczy symbol przed etykietą, a goto nadal będzie w stanie go znaleźć (nie mam pojęcia, dlaczego tak jest). Moje guziki szukają dysku). 2) można umieścić pojedyncze : na końcu nazwy zmiennej, a funkcja wymiany/subtringowania nie zostanie wyzwolona (nawet w przypadku włączonych rozszerzeń). W połączeniu z makrami dla nawiasów komentarze mogą sprawić, że oba przypadki wyglądają prawie tak samo.

Tak oto przykłady (w kolejności Lubię je najbardziej):

Z prostokątnych nawiasach:

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

Z nawiasów klamrowych:

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

Z nawiasy:

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

mieszanką PowerShell C style (< nie mogą być stosowane, ponieważ przekierowania jest z wyższą prio.* nie mogą być stosowane ze względu na %*):

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

Aby Emphase To jest komentarz (myślał, że nie jest tak krótka):

@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

Możesz użyć 'rem. || (' lub 'rem^(zamiast tego .. Intencja jest nieco bardziej wyraźna Zobacz moją zaktualizowaną odpowiedź – dbenham

+0

@dbenham - tak z rem jest krótszy – npocmaka

+1

Ooh, kwadratowe i kręcone formy wsporników Gdybym pisał kod tylko dla siebie, mógłbym go użyć, ale wyobrażam sobie, że przeciętny użytkownik zobaczy to i powie WTF – dbenham

Powiązane problemy