Pergunta

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

Eu quero fazer algo como:

echo hello\nworld

Qual seria a saída:

hello
world
Foi útil?

Solução

echo hello & echo.world

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

Outras dicas

Use:

echo hello
echo.
echo world

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

@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 semelhante ao seguinte:

There should be a newline
inserted here.

Press any key to continue . . .

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

Não é um recurso padrão echo: em cmd / bat-arquivos para escrever linha em branco, que emula uma nova linha em sua cmd-output:

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

Saída do 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 avanço de linha é criada e atribuída para o \ n-variável.
Isso funciona como o acento circunflexo nas tentativas de fim de linha para escapar do próximo caractere, mas se este é um avanço de linha é ignorado e o próximo caractere é lido e escapou (mesmo que este é também um avanço de linha).
Então você precisa de um terceiro avanço de linha para terminar a instrução atual, então a terceira linha seria anexado ao LF-variável.
Mesmo arquivos em lote têm finais de linha com CR / LF apenas o LF são importantes, como as de CR são removidos nesta fase do analisador.

A vantagem de usar a expansão atrasada é, que não há nenhum carácter especial manipulação em tudo.
echo Line1%LF%Line2 seria um fracasso, como o analisador pára de analisar a linefeeds individuais.

Mais explicações são em
SO: comandos longas dividida em várias linhas no Vista / lote DOS (.bat)
SO: Como funciona o interpretador de comandos do Windows (CMD.EXE) roteiros de análise?

Editar: Evite echo.

Isto não responder à pergunta, como a pergunta foi sobre único echo que saída pode múltiplas linhas.

Mas, apesar das outras respostas que sugere o uso de echo. para criar uma nova linha, deve-se notar que echo. é o pior, como é muito lento e pode completamente falhar, como pesquisas cmd.exe para uma ECHO arquivo chamado e tentar iniciá-lo.

Para imprimir apenas uma linha em branco, 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.

disse echo. suficiente.

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

echo Line 1 & echo. & echo line 3

saída seria como:

Line 1

line 3

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

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

Saídas

hello
world

Em seguida, basta jogar em um %n% sempre que quiser uma nova linha em uma declaração eco. Isso é mais perto de seu \n usado em vários idiomas.

Breakdown

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

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

& significa fazer outro comando na mesma linha. Não se preocupam com errorlevel (a uma declaração de eco for crying out loud), por isso não && é necessário.

echo. Continua a declaração echo.

Tudo isso funciona porque você pode realmente criar variáveis ??que são código, e usá-los dentro de outros comandos. É como uma espécie de função de gueto, desde lote não é exatamente o mais avançado de linguagens de script shell. Isso só funciona porque pobre uso do lote de variáveis, não designando entre ints, carboniza, flutuadores, cordas, etc naturalmente.

Se você é astuto, você poderia chegar a este trabalho com outras coisas. Por exemplo, usando-o para ecoar uma guia

set t=^&echo.     ::there are spaces up to the double colon

Quando ecoando algo para redirecionamento para um arquivo, vários comandos de eco não funcionará. Eu acho que talvez o ">>" redirecionador é uma boa escolha:

echo hello > temp
echo world >> 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ê precisa 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 (a b "c d") do @echo %~i)

A saída será,

a
b
c d

Note que quando este é colocado em um arquivo de lote, '%' será duplicada.

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

Se alguém vem aqui porque eles estão olhando para ecoar uma linha em branco a partir de uma MinGW make makefile, eu usei

@cmd /c echo.

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

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

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

echo Hi!
echo[
echo Hello!

Isso funcionou para mim, a expansão não atrasou necessário:

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

Ele escreve saída como esta:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

Ken e soluções Jeb funciona bem.

Mas as novas linhas são gerados com apenas um caráter LF e eu preciso de caracteres CRLF (versão Windows).

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

Exemplo:

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

Se a pessoa precisa usar a famosa \ n em strings literais que podem ser passados ??para uma variável, pode escrever um código como no Hello.bat script 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!%

Esta saída caminho de múltiplas linhas podem por preparada em um lugar, mesmo em outra scritpt ou arquivo externo, e impresso em outro.

A quebra de linha é realizada em nova linha variável. Seu valor deve ser substituído depois echo linha é expandida para que eu use setlocal enableDelayedExpansion para permitir sinais de exclamação que se expandem variáveis ??sobre a execução. E os substitutos de execução \ n com nova linha conteúdo (olhar para a sintaxe em help set ). Poderíamos de uso claro ! Nova linha! ao definir o resposta e \ n é mais conveniente. Ela pode ser passada de fora (try Olá R2 \ ND2 ), onde ninguém sabe o nome da variável que contém a quebra de linha (Sim, Olá C3! Nova linha! P0 funciona da mesma maneira).

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

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


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

Por favor, note que a barra invertida adicional não vai impedir que o script de análise \ n substring.

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

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

Espero que ajude:)

[editar] Hmm você está certo, eu precisava em um Makefile, ele funciona perfeitamente lá. Acho que minha resposta não está adaptado para arquivos em lote ... My bad.

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

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

A maneira mais caráter conservador para alcançar este objetivo em sistemas Linux, é com o alias -e -., Que interpreta escaparam caracteres que são com barra invertida

echo -e "hello\nworld"

Aqui estão outras exemplos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top