Como posso ecoar uma nova linha em um arquivo em lotes?

642

Como você pode inserir uma nova linha da saída do arquivo em lotes?

Eu quero fazer algo como:

echo hello\nworld

Qual seria a saída:

hello
world
Brian R. Bondy
fonte
6
Veio útil para mim. Eu tive que fazer eco \ n \ n | my_app.exe em um script. Eu fiz (eco. && eco.) | meu_app.exe
Vignesh
2
Fácil Approach "Código começa:"> echo Olá & echo mundo, vai dar u what u necessidade
prudviraj
1
Você pode inserir um ascii invisível chr (255) em uma linha separada que forçará uma nova linha em branco. Mantenha pressionada a tecla [alt] e pressione 255 no teclado. isso insere chr (255), que é um quadrado em branco. ou seja, " eco (alt + 255) " Você pode usar apenas o teclado e não os números na parte superior do teclado de consulta!
jwzumwalt
Assim como metade do reparo do computador é conectada e ligada, metade do desenvolvimento de software é o que eu chamo de engenharia espacial . Nós precisamos nossas linhas em branco só assim.
Bob Stein
Que tal agora ? echo Yes&echo No
scientist_7

Respostas:

462

echo hello & echo.world

Isso significa que você pode definir & echo.como uma constante para uma nova linha \n.

Grimtron
fonte
43
o exemplo não precisa de um período, mas você precisa de um para mostrar uma linha em branco vazio:echo. && echo hello && echo. && echo world
Matt Wilkie
4
Você pode fazer isso com um único eco para que possa ser redirecionado para um arquivo?
Shahbaz
46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB
25
A coisa do período em "eco". nunca para de me surpreender. É tão datado, e ainda assim eu sempre esqueço que o ponto deve ser estritamente concatenado com o nome do comando, sem espaços entre eles. Não há nenhum erro no seu post, estou escrevendo isso apenas como um lembrete: "eco". ! = "eco". !
quetzalcoatl
5
@quetzalcoatl, fica ainda mais estranho. Outros caracteres além de pontos também funcionam. O SS64 diz que a melhor sintaxe é echo(para melhorar o desempenho (ainda sem espaço). Discussão prolongada de outros personagens e seus méritos / falhas no ECHO. Não consegue dar texto ou linha em branco - Em vez disso usar ECHO /
Matt Wilkie
558

Usar:

echo hello
echo.
echo world
Matt Lacey
fonte
16
É possível fornecer uma string em uma única instrução de eco?
Brian R. Bondy
5
Por que você precisa fazer isso com uma única declaração de eco; onde está o mal em ter outro?
Rob
3
@ Rob, acabei de me deparar com esse problema e nenhum desses trabalhos. Você precisa ecoar em uma única declaração no meu exemplo. Eu estou gerando alguns arquivos tex de HTML e gerar um Makefile usando echo "Makefile contents (which has \n)" > MakefileCom vários ecos, ele não iria funcionar
Shahbaz
3
Use & (ou &&) para executá-los em uma única instrução: Por exemplo, para colocar "hello \ nworld" em um arquivo txt:(echo hello & echo world) >> ./test.txt
Ned Martin
4
Para saída de várias linhas em um arquivo, por que não fazer o seguinte? echo line 1 > Makefilee depois echo line 2 >> Makefile. O uso de >>faz com que a saída seja anexada ao arquivo, que é precisamente o comportamento necessário para este caso.
dgnuff
141

Aqui está, crie um arquivo .bat com o seguinte:

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

Você deve ver uma saída como a seguinte:

There should be a newline
inserted here.

Press any key to continue . . .

Você só precisa do código entre as instruções REM, obviamente.

jeb
fonte
51
Muito impressionante, você poderia explicar como a linha definida NL = ^^^% NLM %% NLM% ^% NLM %% NLM% funciona? Eu não consigo entender direito
Andy Morris
8
@andy methinks um comentário +8 justifica uma pergunta: stackoverflow.com/questions/6379619/…
matt wilkie
82
Este é um exemplo maravilhoso para mostrar que os arquivos em lote do cmd.exe e do Windows são totalmente loucos!
mivk
12
OBSERVAÇÃO: A linha "set NLM = ^" não deve conter nada após o CARET e deve conter duas linhas em branco após ele.
Mnemotronic
4
Veja minha resposta para um método mais simples. set nl=^&echo., então apenas echo hello %nl% worldproduz o mesmo efeito.
coltonon
96

Há um recurso padrão echo:no cmd / bat-files para escrever uma linha em branco, que emula uma nova linha na sua saída do cmd:

@echo off
@echo line1
@echo:
@echo line2

Saída do citado acima do arquivo cmd:

line1

line2
macropas
fonte
37
De fato, qualquer caractere especial NÃO UTILIZADO deve funcionar. Eu sempre incentivo o uso de / porque a barra é o caractere padrão para as opções de comando. Além disso, eu sempre critico o uso do ponto que alguém da Microsoft escolhe, infelizmente, porque o comando: echo.com fornece resultados diferentes, dependendo da versão do processador de comando do MS-DOS / Windows Batch.
Aacini
21
A única versão que sempre funciona é echo(. Parece que pode causar problemas, mas na verdade funciona perfeitamente. Todos os outros formulários têm pelo menos uma situação em que o comando não funcionará conforme desejado.
precisa saber é
5
@naxa - Nada oficial, apenas conhecimento coletivo derivado de alguns hackers em lote. O objetivo é ter uma sintaxe que possa ser usada para ECO qualquer valor, incluindo nada, e nunca ter que se preocupar em obter algo além do esperado. O melhor resumo que conheço está em dostips.com/forum/viewtopic.php?p=4554#p4554 . Isso meio que deixa você pendurado, mas ninguém nunca apresentou um cenário em que ECHO(falha.
dbenham
2
@Pacerier - há exemplos de falha para cada uma dessas sugestões. Leia com atenção dostips.com/forum/viewtopic.php?p=4554#p4554 .
Dbenham 29/07/2015
2
@ Pacerier, há eco suficiente acontecendo aqui para uma pergunta independente. Talvez algo como "quais personagens podem seguir imediatamente echoe quais são seus efeitos?"
Matt Wilkie
68

Como a resposta de Ken, mas com o uso da expansão atrasada.

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

Primeiro, um único caractere de avanço de linha é criado e atribuído à variável \ n.
Isso funciona quando o cursor no final da linha tenta escapar do próximo caractere, mas se esse for um avanço de linha, ele será ignorado e o próximo caractere será lido e escapado (mesmo que também seja um avanço de linha).
Então você precisa de um terceiro avanço de linha para finalizar a instrução atual; caso contrário, a terceira linha será anexada à variável LF.
Mesmo arquivos em lote têm finais de linha com CR / LF, apenas o LF é importante, pois os CRs são removidos nesta fase do analisador.

A vantagem de usar a expansão atrasada é que não há manipulação de caracteres especiais.
echo Line1%LF%Line2falharia, pois o analisador para de analisar em alimentações de linha únicas.

Mais explicações estão no
SO: Comandos longos divididos em várias linhas no arquivo em lotes do Vista / DOS (.bat)
SO: Como o Windows Command Interpreter (CMD.EXE) analisa scripts?

Editar: Evitar echo.

Isso não responde à pergunta, pois a pergunta era sobre uma única echoque pode gerar várias linhas.

Mas, apesar das outras respostas que sugerem o uso de echo.para criar uma nova linha, note-se que echo.é a pior, pois é muito lenta e pode falhar completamente, pois o cmd.exe procura um arquivo chamado ECHOe tenta iniciá-lo.

Para imprimir apenas uma linha vazia, você pode usar um dos

echo,
echo;
echo(
echo/
echo+
echo=

Mas o uso de echo., echo\ou echo:devem ser evitados, pois podem ser muito lento, dependendo do local onde o script será executado, como uma unidade de rede.

jeb
fonte
1
Se você estiver passando a string com novas linhas como parâmetro para uma sub-rotina em lote, por exemplo call :pause line1!\n!line2, inicie a sub-rotina setlocal EnableDelayedExpansione termine-a com setlocal DisableDelayedExpansionpara impedir que as novas linhas sejam interpretadas prematuramente.
Stevek_mcc 8/11
2
+1 no elenco de personagens echo, echo; echo( echo/ echo+ echo=e na galeria de bandidos echo. echo\ echo:. Agora, se você explicasse por que diabos esses trabalhos, eu lhe devo uma cerveja grátis.
Bob Stein
40

echo. Disse o suficiente.

Se você precisar em uma única linha, use o &. Por exemplo,

echo Line 1 & echo. & echo line 3

produziria como:

Line 1

line 3

Agora, diga que você quer algo um pouco mais sofisticado, ...

set n=^&echo.
echo hello %n% world

Saídas

hello
world

Em seguida, basta inserir um %n%sempre que desejar uma nova linha em uma declaração de eco. Isso é mais parecido com o \nusado em vários idiomas.

Demolir

set n=define a variável nigual a:

^ Anula o próximo símbolo a seguir:

&Significa executar outro comando na mesma linha. Nós não nos importamos com o nível de erro (é uma declaração de eco para chamar a atenção), portanto, não &&é necessário.

echo. Continua a declaração de eco.

Tudo isso funciona porque você pode realmente criar variáveis ​​que são código e usá-las dentro de outros comandos. É como uma função do gueto, já que o lote não é exatamente a mais avançada das linguagens de script de shell. Isso funciona apenas porque o uso insuficiente de variáveis ​​do lote, não designa entre ints, chars, floats, strings, etc. naturalmente.

Se você é esperto, pode fazer isso funcionar com outras coisas. Por exemplo, usá-lo para ecoar uma guia

set t=^&echo.     ::there are spaces up to the double colon
Coltonon
fonte
7
Não use echo.como ele tenta primeiro encontrar um arquivo com esse nome. Use outra pontuação, comoecho,
Reinstate Monica
20

Ao ecoar algo para redirecionar para um arquivo, vários comandos de eco não funcionarão. Acho que talvez o redirecionador ">>" seja uma boa opção:

eco Olá> temp
mundo do eco >> temp
Crend King
fonte
8
O primeiro exemplo, usando ">", criará um novo arquivo, o segundo, usando ">>", será anexado a um arquivo existente (ou criará se ainda não existir).
Yann Duran
1
(echo hello && echo world) > tempmencionado por J. J. Brauer em um comentário aos trabalhos de resposta aceitos (atuais).
GeroldBroser restabelece Monica
15

Assim como Grimtron sugere - aqui está um exemplo rápido para defini-lo:

@echo off
set newline=^& echo.
echo hello %newline%world

Resultado

C:\>test.bat
hello
world
Peter Mortensen
fonte
Na verdade, ele ecoará uma nova linha adicional após o "mundo"
BlueRaja - Danny Pflughoeft
1
@ azul, a nova linha à direita parece ser função do próprio arquivo em lotes. Se você repetir a echo hello %newline%worldlinha, não há espaços entre eles.
Matt Wilkie
2
echo "Hello %newline% world"falha porque está dentro de aspas. Porque não é uma nova linha real .
jeb
14

Se você precisar colocar resultados em um arquivo, poderá usar

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
test30
fonte
9

Você também pode fazer assim,

(for %i in (a b "c d") do @echo %~i)

A saída será,

a
b
c d

Observe que quando isso é colocado em um arquivo em lotes, '%' deve ser duplicado.

(for %%i in (a b "c d") do @echo %%~i)
Albert
fonte
Essa solução também funciona se você deseja repetir um e comercial e não uma nova linha.
parvus
Eu acho que encontrei um bug: o *char
7

Se alguém vem aqui porque quer ecoar uma linha em branco de um makefile MINGW, eu usei

@cmd /c echo.

simplesmente usar echo.causa a temida process_begin: CreateProcess(NULL, echo., ...) failed.mensagem de erro.

Espero que isso ajude pelo menos uma outra pessoa lá fora :)

Wayne Uroda
fonte
Mas essa não é a questão. Downvote!
Mesalcode
Não tenho certeza se sarcasmo ou não: P
Wayne Uroda
Descubra procurando na sua caixa de entrada: D
Mesalcode
3

Se for necessário usar o famoso \ n em literais de string que podem ser passados ​​para uma variável, escreva um código como no script Hello.bat abaixo:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

Dessa forma, a saída multilinha pode ser preparada em um local, mesmo em outro arquivo escrito ou externo, e impressa em outro.

A quebra de linha é mantida na variável newline . Seu valor deve ser substituído depois que a linha de eco for expandida, para que eu use setlocal enableDelayedExpansion para ativar sinais de exclamação que expandem variáveis ​​na execução. E a execução substitui \ n pelo conteúdo da nova linha (procure sintaxe no conjunto de ajuda ). É claro que poderíamos usar ! Newline! enquanto define a resposta, mas \ n é mais conveniente. Pode ser transmitido de fora (tente Olá R2 \ nD2 ), onde ninguém sabe o nome da variável que contém a quebra de linha (Sim, Olá C3! Newline! P0 funciona da mesma maneira).

O exemplo acima pode ser refinado para uma sub-rotina ou lote independente, usado como call:mlecho Hi\nI'm your comuter:

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

Observe que essa barra invertida adicional não impedirá que o script analise \ n substring.

Tomator
fonte
1
Você está essencialmente fazendo a mesma coisa que a resposta de Jeb acima.
Squashman 8/06
As respostas que li acima foram muito úteis, mas eu precisava chamar um script de sub-rotina que analisará \ n, para evitar a implementação do truque em qualquer lugar. Isso precisava refinar uma solução e eu compartilhei esse refinamento. Espero que não tenha prejudicado nenhum animal.
Tomator
2

Isso funcionou para mim, sem necessidade de expansão atrasada:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

Ele escreve uma saída como esta:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
NahuelGQ
fonte
4
-1 echo asdf >myfile.txtproduzirá exatamente os mesmos resultados. echoacrescenta uma nova linha ao final da sequência.
BlueRaja - Danny Pflughoeft
2
Ótima resposta, sendo a única pessoa que reconheceu o valor de usar os parênteses para novas linhas. Acredito que é assim que os criadores do DOS pretendiam que você o fizesse.
precisa saber é o seguinte
2

Para iniciar uma nova linha no lote, tudo o que você precisa fazer é adicionar "echo [", assim:

echo Hi!
echo[
echo Hello!
PryroTech
fonte
5
É lento e falha quando existe um arquivo com o nomeecho[.bat
jeb 23/12
O que? Ele deve funcionar instantaneamente e também excluir o arquivo echo [.bat.
PryroTech
2
É praticamente a mesma coisa que eco. sintaxe.
PryroTech
5
Sim e também echo.é uma má solução.
jeb
1
Como pode ser visto nas respostas anteriores, isso tentará localizar um arquivo no caminho primeiro, o que faz com que seja muito lento. O mesmo vale para echo.. Esperar que os usuários do seu script excluam arquivos no sistema deles apenas porque o script precisa de uma nova linha não me parece um bom design.
Abel
2

As soluções Ken e Jeb funcionam bem.

Mas as novas linhas são geradas com apenas um caractere LF e eu preciso de caracteres CRLF (versão do Windows).

Para isso, no final do script, eu converti LF para CRLF.

Exemplo:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
otaviodecampos
fonte
0

Você pode usar @echo(@echo + [espaço] + [espaço insecável])

Nota: O espaço insecável pode ser obtido com Alt + 0160

Espero que ajude :)

[edit] Hmm, você está certo, eu precisava disso em um Makefile, funciona perfeitamente lá. Eu acho que minha resposta não está adaptada para arquivos em lote ... Meu mal.

johan d
fonte
Eu tenho ECHO ist eingeschaltet (ON).não uma linha vazia, tentou no cmd prompt
jeb
1
É um espaço ininterrupto, não uma nova linha.
Ry-
0

Esta solução funciona (testada):

type nul | more /e /p

Isso converte avanços de linha isolados em combinação de avanço de linha de retorno de carro.

Wasif Hasan
fonte
Mas como isso adiciona uma nova linha entre um texto? A pergunta é sobreecho hello \n world
jeb 20/01
Voto negativo de mim. Esta não é uma resposta para a pergunta
Mesalcode
-2

Não posso torná-lo mais simples do que:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
tensão
fonte