Commentare più righe nel file batch DOS


98

Ho scritto un enorme file batch MS DOS. Per testare questo file batch ho bisogno di eseguire solo alcune righe e voglio nascondere / commentare rimanenti.

Ho alcune righe di commento esistenti che iniziano con, ::quindi non posso ::più usarle in quanto codificheranno tutti i commenti.

Come posso risolvere questo problema?

Risposte:


182

Puoi usare a gotoper saltare il codice.

goto comment
...skip this...
:comment

11
+1: È divertente usare "goto" per questo E funziona!
rap-2-h

1
Penso che la cosa divertente sia che non esiste una vera definizione di commento nella riga di comando, semplicemente non posso accettare REMrighe come righe di commento, rende l'output oscuro
mkb

125

Se vuoi aggiungere REM all'inizio di ogni riga invece di usare GOTO, puoi usare Notepad ++ per farlo facilmente seguendo questi passaggi:

  1. Seleziona il blocco di linee
  2. premi Ctrl-Q

Ripeti i passaggi per rimuovere il commento


6
Bel suggerimento. lo rende molto più pulito.
Venom

1
Wow, non sapevo che Notepad ++ avesse una caratteristica così bella! In realtà mi mancava davvero perché sono abituato a "Ctrl + 7" in Eclipse. Votato fino a 42 ;)
Danny Lo

1
E il discommento. C'è una scorciatoia per rimuovere il commento dall'intero blocco.
Bhaskar Singh

2
@BhaskarSingh A partire da Notepad ++ 7.5.6, puoi semplicemente evidenziare il testo già commentato; fai "Ctrl + Q" e rimuoverà il commento
CreativiTimothy

Se il cervello è spesso debole come la mia da ricordare Ctrl-Q, fare clic Notepad++: Edit -> Comment/Uncomment.
Timo

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

Sebbene la gotosoluzione sia una buona opzione, non funzionerà tra parentesi (inclusi i comandi FOR e IF), ma funzionerà. Anche se dovresti fare attenzione alla chiusura delle parentesi e alla sintassi non valida per i comandi FORe IFperché verranno analizzati.

Aggiornare

L'aggiornamento in risposta del dbenham mi ha dato alcune idee. Primo - ci sono due casi diversi in cui possiamo aver bisogno di commenti su più righe - nel contesto di una parentesi in cui GOTO non può essere utilizzato e al di fuori di esso. All'interno del contesto delle parentesi possiamo usare altre parentesi se c'è una condizione che impedisce l'esecuzione del codice Anche se il codice verrà comunque analizzato e verranno rilevati alcuni errori di sintassi ( FOR,IF , staffe in modo improprio chiusi, espansione di parametro sbagliato ..). Quindi, se è possibile è meglio usare GOTO.

Sebbene non sia possibile creare una macro / variabile utilizzata come etichetta, ma è possibile utilizzare macro per i commenti delle parentesi, tuttavia si possono utilizzare due trucchi per rendere i commenti GOTO più simmetrici e più piacevoli (almeno per me). Per questo userò due trucchi: 1) puoi mettere un singolo simbolo davanti a un'etichetta e goto sarà ancora in grado di trovarlo (non ho idea del perché sia ​​questo, secondo me sta cercando un'unità).2) puoi mettere un singolo : alla fine del nome di una variabile e una funzione di sostituzione / sottrazione non verrà attivata (anche con estensioni abilitate). Che combinato con le macro per i commenti tra parentesi può far sembrare entrambi i casi quasi uguali.

Quindi ecco gli esempi (nell'ordine che mi piacciono di più):

Con staffe rettangolari :

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

Con parentesi graffe :

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

Con parentesi :

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

Miscela tra stili PowerShell e C ( <non può essere utilizzato perché il reindirizzamento è con prezzo più alto. *Non può essere utilizzato a causa di %*):

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

Per sottolineare questo è un commento (anche se non è così breve):

@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
Potresti usare rem.||(o rem^ (invece. L'intento è un po 'più chiaro. Vedi la mia risposta aggiornata.
dbenham

@dbenham - sì con rem è più breve.
npocmaka

1
Ooh, le forme di parentesi quadrate e ricce sono sexy. Se stessi scrivendo codice solo per me stesso, potrei usarlo. Ma immagino che l'utente medio lo vedrebbe e direbbe WTF.
dbenham

@dbenham - forse hai ragione.Posso includere anche il modulo %rem:%+ %:rem%per renderlo più ovvio anche se perderà il suo fascino o solo per essere più vicino allo stile C ...
npocmaka

1
@npocmaka Questo è fantastico! Ho appena imparato un sacco di complessità di scripting batch mentre capivo cosa hai fatto. Tra tutti i metodi di commento a blocchi di cui sono a conoscenza (per batch), questo sembra essere il più robusto e intelligente. +1 per la combinazione di hack e stile
Jared Gotte

10

Un'altra opzione è racchiudere le righe indesiderate in un blocco IF che non può mai essere vero

if 1==0 (
...
)

Ovviamente non verrà eseguito nulla all'interno del blocco if, ma verrà analizzato. Quindi non puoi avere alcuna sintassi non valida all'interno di. Inoltre, il commento non può contenere) meno che non sia sottoposto a escape o citato. Per questi motivi la soluzione GOTO accettata è più affidabile. (La soluzione GOTO potrebbe anche essere più veloce)

Aggiornamento 2017-09-19

Ecco un miglioramento cosmetico alla soluzione GOTO di pdub . Definisco una semplice variabile di ambiente "macro" che rende la sintassi del commento GOTO un po 'più auto documentata. Sebbene sia generalmente consigliato che: le etichette siano univoche all'interno di uno script batch, è davvero OK incorporare più commenti come questo nello stesso script batch.

@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

Oppure potresti usare una di queste varianti della soluzione di npocmaka . L'uso di REM invece di BREAK rende l'intento un po 'più chiaro.

rem.||(
   remarks
   go here
)

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

1

Voglio solo menzionare che la soluzione GOTO di pdub non è completamente corretta nel caso in cui: l'etichetta del commento appare più volte. Modifico il codice da questa domanda come esempio.

@ECHO OFF
SET FLAG=1
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF...
    GOTO comment
    ECHO "COMMENT PART 1"
:comment
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK
)

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF...
    GOTO comment
    ECHO "COMMENT PART"
:comment
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK
)

L'output sarà

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK

Il comando ECHO QUI A TD_NEXT NEL PRIMO BLOCCO viene saltato.


0

@jeb

E dopo averlo usato, lo stderr sembra essere inaccessibile

No, prova questo:

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

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

   echo hello Tunisia

  pause

Ma perché funziona?

scusa, rispondo alla domanda in frensh:

(la redirection par 3> est spécial car elle persiste, on va l'utiliser pour capturer le flux des erreurs 2> est on va le transformer en un flusso persistant à l'ade de 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre environement de script..par la suite si on veux recuperer le flux 'stderr' il faut faire une autre redirection du handle 2> au handle 1> here n'est autre que la console ..)


1
Non riesco a leggere il francese, ma non sembra che tu affronti il ​​motivo per cui lo stream 2 (stderr) continua ad essere disabilitato dopo che il reindirizzamento iniziale è finito. Ho una teoria praticabile e casi di test in 2 post consecutivi su dostips.com/forum/viewtopic.php?p=14612#p14612 .
dbenham

(Il reindirizzamento di 3> è speciale perché persiste, lo useremo per catturare il flusso di errori 2> se lo trasformerà in un flusso persistente fino a 3> questo ci permetterà di avere un errore di gestione per uno qualsiasi dei nostri script di ambiente .. quindi se vuoi recuperare il flusso 'stderr' dobbiamo fare un altro reindirizzamento
dell'handle

-1

prova questo:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1, ma perché funziona? E dopo averlo usato, lo stderr sembra essere inaccessibile
jeb

1
-1, Questo "funziona" perché echo 2> Nul sta reindirizzando il flusso di errore standard a NUL, seppellendolo (i 3> Nul, 4> Nul stanno reindirizzando i flussi ausiliari senza una vera ragione). Questo non commenta le righe, impedisce semplicemente la visualizzazione dei messaggi di errore. Quindi tutto ciò che può essere interpretato come righe di comando verrà comunque eseguito.
pdubs

3
Il commento di pdubs è parzialmente corretto in quanto i comandi sono ancora in esecuzione (e falliscono perché non validi). Ma i comandi validi verrebbero eseguiti senza errori. Quindi questa non è una buona soluzione per commentare righe di codice. La spiegazione del motivo per cui stream 2 (stderr) è disabilitato "permanentemente" non è corretta.
dbenham

3
Ho una teoria su come funziona il reindirizzamento nel batch di Windows e spiega perché stderr viene disabilitato "permanentemente" in questa risposta. La teoria e i test sono in 2 post consecutivi su dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.