Como você pode ecoar uma nova linha em arquivos em lote?

Como você pode inserir uma nova linha de saída do arquivo de lote?

Eu quero fazer algo como:

> echo hello\nworld

Qual saída:

Olá
mundo

echo hello & echo.world

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

Usar:

 echo hello echo. echo world 

Aqui você vai, 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 a saída como segue:

 There should be a newline inserted here. Press any key to continue . . . 

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

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

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

Saída de citado acima cmd-file:

 line1 line2 

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 alimentação de linha é criado e atribuído à variável \ n.
Isso funciona como o cursor na extremidade da linha tenta escaping do próximo caractere, mas se isso for um avanço de linha, ele será ignorado e o próximo caractere será lido e escapado (mesmo que isso também seja um avanço de linha).
Então você precisa de um terceiro avanço de linha para terminar a instrução atual, senão a terceira linha seria anexada à variável LF.
Até mesmo os arquivos em lote possuem terminações de linha com CR / LF, apenas o LF é importante, pois os CRs são removidos nessa fase do analisador.

A vantagem de usar a expansão atrasada é que não há manipulação especial de caracteres.
echo Line1%LF%Line2 falharia, pois o analisador para de analisar em single linefeeds.

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

Editar: Evite o echo.

Isso não responde à pergunta, pois a pergunta era sobre o echo único que pode gerar várias linhas.

Mas apesar das outras respostas, quem sugere o uso do echo. para criar uma nova linha, deve-se notar que o echo. é o pior, pois é muito lento e pode falhar completamente, pois o cmd.exe procura um arquivo chamado ECHO e tenta iniciá-lo.

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

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

Mas o uso do echo. , echo\ ou echo: devem ser evitados, pois podem ser muito lentos, dependendo da localização em que o script será executado, como uma unidade de rede.

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, digamos que você quer algo um pouco mais chique, …

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

Saídas

 hello world 

Em seguida, adicione um %n% sempre que desejar uma nova linha em uma instrução de eco. Isto é mais próximo do seu \n usado em vários idiomas.

Demolir

set n= ajusta a variável n igual a:

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

& Meios para fazer outro comando na mesma linha. Nós não nos importamos com errorlevel (é uma declaração de eco para chorar em voz alta), então não && é necessário.

echo. Continua a declaração de eco.

Tudo isso funciona porque você pode criar variables ​​que são código e usá-las dentro de outros comandos. É como uma function de gueto, já que o batch não é exatamente o mais avançado das linguagens de script de shell. Isso só funciona porque o uso de variables ​​do lote é fraco, não designando entre ints, chars, floats, strings, etc.

Se você é habilidoso, você 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 

Quando ecoar algo para redirect para um arquivo, vários comandos de eco não funcionarão. Acho que talvez o redirecionador “>>” seja uma boa escolha:

 echo ola> temp
 echo mundo >> temp

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

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

Saída

 C:\>test.bat hello world 

Se você precisar colocar os resultados em um arquivo, você pode usar

 (echo a & echo. & echo b) > file_containing_multiple_lines.txt 

Você também pode fazer assim,

 (for %i in (ab "cd") do @echo %~i) 

A saída será

 a b cd 

Observe que quando isso é colocado em um arquivo de lote, ‘%’ deve ser duplicado.

 (for %%i in (ab "cd") do @echo %%~i) 

Se alguém vem aqui porque eles estão procurando ecoar uma linha em branco de um MINGW make makefile, eu usei

@cmd /c echo.

simplesmente usando echo. faz com que o process_begin: CreateProcess(NULL, echo., ...) failed. temido process_begin: CreateProcess(NULL, echo., ...) failed. mensagem de erro.

Espero que isso ajude pelo menos uma outra pessoa por aí 🙂

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

 echo Hi! echo[ echo Hello! 

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

 @echo off ( echo ^ echo ^ echo Hello echo ^ echo ^ ) pause 

Escreve saída assim:

   Hello   Press any key to continue . . . 

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 Windows).

Para isso, no final do script, convertei LF para CRLF.

Exemplo:

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

Se for necessário usar o famoso \ n em literais de string que podem ser passados ​​para uma variável, pode escrever 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!% 

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

A quebra de linha é mantida na variável newline . Seu valor deve ser substituído após a linha de eco ser expandida, portanto, uso setlocal enableDelayedExpansion para ativar os sinais de exclamação que expandem as variables ​​na execução. E a execução substitui \ n com o conteúdo da nova linha (procure a syntax no conjunto de ajuda ). Poderíamos, é claro, usar ! Newline! enquanto ajusta a resposta mas \ n é mais conveniente. Pode ser passado de fora (tente o Hello R2 \ nD2 ), onde ninguém sabe o nome da variável que segura a quebra de linha (Yes, Hello C3! Newline! P0 funciona da mesma forma).

Acima exemplo pode ser refinado para uma sub-rotina ou lote autônomo, 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 a substring.

Você pode usar @echo (@echo + [espaço] + [espaço inseguro])

Nota: O espaço insecable pode ser obtido com Alt + 0160

Espero que ajude 🙂

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

Eu não posso fazer isso mais simples do que:

 echo echo hello^&echo world^&pause>silly.bat call silly.bat 

A maneira mais conservadora de fazer isso nos sistemas linux é com o -e alias – que interpreta os caracteres de escape que são backslashed.

 echo -e "hello\nworld" 

Aqui estão outros exemplos