Como "comentar" (adicionar comentário) em um lote / cmd?


883

Eu tenho um arquivo em lotes que executa vários scripts python que fazem modificações na tabela.

  1. Quero que os usuários comentem os scripts python 1-2 que eles não desejam executar, em vez de removê-los do arquivo em lotes (para que o próximo usuário saiba que esses scripts existem como opções!)

  2. Também quero adicionar comentários para chamar a atenção deles especificamente para as variáveis ​​que eles precisam atualizar no arquivo em lotes antes de executá-lo. Vejo que posso usar REM. Mas parece que isso é mais para atualizar o usuário com progresso depois de executá-lo.

Existe uma sintaxe para adicionar um comentário de maneira mais apropriada?


6
Veja também excelentes respostas aqui stackoverflow.com/q/12407800/1011025
ndemou

2
Você pode usar o Rem Sthcomando ou usar esta marca::: Sth
scientist_7

Respostas:


881

O remcomando é de fato para comentários. Ele não atualiza inerentemente ninguém depois de executar o script. Alguns autores de scripts podem usá-lo dessa maneira em vez de echo, porque, por padrão, o interpretador de lote imprime cada comando antes de ser processado. Como os remcomandos não fazem nada, é seguro imprimi-los sem efeitos colaterais. Para evitar a impressão de um comando, prefixe-o com @, ou, para aplicar essa configuração ao longo do programa, execute @echo off. (É echo offpara evitar a impressão de mais comandos; @é para evitar a impressão desse comando antes que a configuração de eco entre em vigor.)

Portanto, no seu arquivo em lotes, você pode usar o seguinte:

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

405
você também pode usar dois pontos "::". É uma das duas maneiras de adicionar comentários no arquivo em lotes sem exibir ou executar essa linha quando o arquivo em lotes é executado. Diferentemente do REM, essa linha não será exibida independentemente se o ECHO desativado estiver no arquivo em lotes.
Brent81

12
@ Brent81 Acho que essa deve ser a resposta correta. Ao usar o destaque da sintaxe, o comando REM não destaca o texto como "comentado".
Automatico

17
O duplo-dois pontos é um "rótulo inválido"; aqui está um artigo que explica e por que o desempenho pode ser melhor que o REM (especialmente em disquetes!) e não funciona em blocos de código recuado (apenas no primeiro caractere): robvanderwoude.com/comments.php
Michael Paulukonis

4
Interessante. I embora REM foi o 'comentário linha inteira' e dois pontos duplo era o 'comentário inline', comoREM This whole line is a comment @echo off :: This comment is inline
Richard Smith

@Alhadis, o script de configuração do Perl está escrito no shell Bourne, não no Windows, então como é relevante aqui? Além disso, o comando dois pontos sendo a sintaxe Bourne válida não é um "efeito colateral bônus"; é exatamente por isso que é usado nesse script Bourne . É usado em favor de #comentários porque #, evidentemente, pode não ser um designador de comentário válido em todos os shells que o Configure deve suportar; veja a linha 3.
Rob Kennedy

956

Use ::ouREM

::   commenttttttttttt
REM  commenttttttttttt

MAS (como as pessoas observaram):

  • Se você usar inline, precisará adicionar &caracteres:
    your commands here & :: commenttttttttttt
  • A lógica aninhada interna ( IF/ELSE, FORloops, etc ...) é usada REMporque ::gera um erro.
  • :: pode falhar dentro setlocal ENABLEDELAYEDEXPANSION

79
Os dois pontos duplos :: É o comentário .bat mais limpo que existe. E pode ser usado no início ou no meio de uma linha!
ATSiem 23/08/13

10
Não funcionou para mim quando feito em linha como este. cd "C:\Folder" ::this throws a syntax error
Shaun Rowan

3
Também falha git add :: blah this is not a commentcom "fatal: pathspec 'blah' não corresponde a nenhum arquivo"
Bob Stein

19
Para um comentário na mesma linha que o exemplo ilustra, você precisa adicionar &entre o código e o comentário ::. Para ilustrar, aberta cmd rápida e corrida dir ::blahque não listar o conteúdo de .e comparar com dir & ::blah, o que faz
Rado

19
Aviso, o uso de ::scripts de bug com setlocal ENABLEDELAYEDEXPANSIONefor
Azevedo

50

Não, arquivos em lote antigos simples são usados REMcomo comentário. ECHOé o comando que imprime algo na tela.

Para "comentar" seções do arquivo que você pode usar GOTO. Um exemplo de todos esses comandos / técnicas:

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

O que posso dizer? os arquivos em lote são uma relíquia dos tempos antigos, são desajeitados e feios.

Você pode ler mais neste site .

EDIT: modificou um pouco o exemplo para que ele contenha os elementos que você aparentemente está procurando.


31

O :: em vez do REM foi usado preferencialmente nos dias em que os computadores não eram muito rápidos. As linhas REM são lidas e depois ignoradas. As linhas :: 'ed são ignoradas por todo o caminho. Isso pode acelerar o seu código nos "velhos tempos". Ainda mais depois de um REM, você precisa de um espaço, depois de :: você não precisa.

E como dito no primeiro comentário: você pode adicionar informações a qualquer linha que achar necessário

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

Quanto ao salto de peças. Colocar o REM na frente de cada linha pode consumir bastante tempo. Como mencionado, usar o GOTO para ignorar partes é uma maneira fácil de ignorar grandes partes de código. Certifique-se de definir um: LABEL no ponto em que deseja que o código continue.

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
Como uma linha de dois pontos duplos pode ser ignorada sem ser lida? O intérprete não deve primeiro ler a linha antes de reconhecê-la como uma linha de dois pontos?
Rob Kennedy

2
@ RobKennedy enquanto leio a resposta, ele não lê nada após o ::, onde tudo após o REM é lido.
James Jenkins

5
Se o interpretador de comandos parar de ler @James, ele nunca executará mais o arquivo. Obviamente, ele precisa continuar lendo para descobrir onde o comentário termina e onde a próxima linha do arquivo começa. Tem que fazer isso com ::e remigualmente.
Rob Kennedy

2
@ RobKennedy, eu também pensei que estava implícito que só se aplicava à linha em que o comando estava.
James Jenkins

7
@RobKennedy ele ler , mas não analisar (ou processo) o que lê, ele só salta até a próxima \ne, em seguida, começa a analisar novamente [carece de fontes?]
xDaizu

25

Comentários em várias linhas

Se houver um grande número de linhas que você deseja comentar, será melhor se você puder fazer comentários com várias linhas em vez de comentar todas as linhas.

Veja este post de Rob van der Woude nos blocos de comentários :

O idioma do lote não possui blocos de comentários, embora haja maneiras de obter o efeito.

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

Você pode usar GOTORótulo e: Rótulo para fazer comentários em bloco.

Ou, se o bloco de comentários aparecer no final do arquivo em lotes, você poderá escrever EXITno final do código e, em seguida, qualquer número de comentários para sua compreensão.

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

isso geralmente é usado em scripts híbridos em lote e VBS / JS, embora eles usem se, em ifvez de goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
phuclv

13

Colocando comentários na mesma linha com os comandos: use & :: comment

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

Explicação:

&separa dois comandos , portanto, neste caso, color Cé o primeiro comando e :: set red font coloro segundo.


Importante:

Esta declaração com comentário parece intuitivamente correta:

goto error1         :: handling the error

mas não é um uso válido do comentário. Funciona apenas porque gotoignora todos os argumentos anteriores ao primeiro. A prova é fácil, isso gototambém não falhará:

goto error1 handling the error

Mas tentativa semelhante

color 17            :: grey on blue

falha de executar o comando devido a 4 argumentos desconhecido para o colorcomando: ::, grey, on, blue.

Funcionará apenas como:

color 17     &      :: grey on blue

Portanto, o e comercial é inevitável.


De outras respostas, parece que o e comercial não é necessário?
RoG

3
@ Snaptastic - As outras respostas estão realmente erradas neste ponto, veja minha edição recente.
miroxlav

Este parece ser o caminho correto; Ele ainda é destacado como comentário no meu IDE.
baburao

5

Você pode comentar algo usando ::ou REM:

your commands here
:: commenttttttttttt

ou

your commands here
REM  commenttttttttttt

 

Para fazer isso na mesma linha que um comando, você deve adicionar um e comercial:

your commands here      & ::  commenttttttttttt

ou

your commands here      & REM  commenttttttttttt

 

Nota:

  • Usar :: na lógica aninhada ( IF-ELSE, FORloops, etc ...) causará um erro. Nesses casos, use em REMvez disso.

Isso é baseado na resposta de T.Todua. Eu senti que a resposta deles era boa, mas deixei de fora alguns detalhes importantes, mas eles revertiram minha edição, então estou transformando minha revisão em sua própria resposta.
Pikamander2

Pikamander2, a sua revisão (também, apontado por usuário @Rado foi incorporada na resposta que o tempo e obrigado por isso, apenas eu preferia um outro estilo para resposta e usados estilo diferente.
T.Todua

1

Este é um tópico antigo e gostaria de adicionar meu entendimento aqui para expandir o conhecimento deste tópico interessante.

A principal diferença entre REM e :: é:

REM é um comando em si, enquanto :: não é.

Podemos tratar :: como um token que, assim que o analisador CMD encontrar o primeiro espaço não em branco de uma linha, é este :: token, ele simplesmente ignorará a linha inteira e lerá a próxima linha. É por isso que o REM deve ser seguido por pelo menos um espaço em branco para poder funcionar como um comentário para a linha, enquanto :: não precisa de nenhum espaço em branco atrás dela.

Que REM é um comando em si pode ser melhor entendido a partir da seguinte sintaxe FOR

A sintaxe básica do FOR é a seguinte

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

aqui <Command>pode haver qualquer comando válido. Assim, podemos escrever a seguinte linha de comando válida, como remé um comando

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

No entanto, NÃO PODEMOS escrever a seguinte linha, pois isso ::não é um comando

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

3
tecnicamente, ::é uma etiqueta (inválida) (o que explica seu comportamento) e por isso não deve ser utilizado (embora ainda é bastante comum)
Stephan

1

Você pode adicionar comentários ao final de um arquivo em lotes com esta sintaxe:

@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

Apenas certifique-se de nunca usar parênteses de fechamento.

Atribuições: Leo Guttirez Ramirez em https://www.robvanderwoude.com/comments.php

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.