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
echo Yes&echo No
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
echo Yes&echo No
Respostas:
echo hello & echo.world
Isso significa que você pode definir & echo.
como uma constante para uma nova linha \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Usar:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
Com vários ecos, ele não iria funcionar
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
e 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.
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.
set nl=^&echo.
, então apenas echo hello %nl% world
produz o mesmo efeito.
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
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.
ECHO(
falha.
echo
e quais são seus efeitos?"
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%Line2
falharia, 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 echo
que 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 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 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.
call :pause line1!\n!line2
, inicie a sub-rotina setlocal EnableDelayedExpansion
e termine-a com setlocal DisableDelayedExpansion
para impedir que as novas linhas sejam interpretadas prematuramente.
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.
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 \n
usado em vários idiomas.
Demolir
set n=
define a variável n
igual 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
echo.
como ele tenta primeiro encontrar um arquivo com esse nome. Use outra pontuação, comoecho,
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
(echo hello && echo world) > temp
mencionado por J. J. Brauer em um comentário aos trabalhos de resposta aceitos (atuais).
Assim como Grimtron sugere - aqui está um exemplo rápido para defini-lo:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
linha, não há espaços entre eles.
echo "Hello %newline% world"
falha porque está dentro de aspas. Porque não é uma nova linha real .
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)
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 :)
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.
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 . . .
echo asdf >myfile.txt
produzirá exatamente os mesmos resultados. echo
acrescenta uma nova linha ao final da sequência.
Para iniciar uma nova linha no lote, tudo o que você precisa fazer é adicionar "echo [", assim:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
é uma má solução.
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.
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
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.
ECHO ist eingeschaltet (ON).
não uma linha vazia, tentou no cmd prompt
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.
echo hello \n world