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
windows
batch-file
newline
Brian R. Bondy
fonte
fonte
echo Yes&echo No
Respostas:
echo hello & echo.world
Isso significa que você pode definir
& echo.
como uma constante para uma nova linha\n
.fonte
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:
fonte
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 depoisecho 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:
Você deve ver uma saída como a seguinte:
Você só precisa do código entre as instruções REM, obviamente.
fonte
set nl=^&echo.
, então apenasecho 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:Saída do citado acima do arquivo cmd:
fonte
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.
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 queecho.
é a pior, pois é muito lenta e pode falhar completamente, pois o cmd.exe procura um arquivo chamadoECHO
e tenta iniciá-lo.Para imprimir apenas uma linha vazia, você pode usar um dos
Mas o uso de
echo.
,echo\
ouecho:
devem ser evitados, pois podem ser muito lento, dependendo do local onde o script será executado, como uma unidade de rede.fonte
call :pause line1!\n!line2
, inicie a sub-rotinasetlocal EnableDelayedExpansion
e termine-a comsetlocal DisableDelayedExpansion
para impedir que as novas linhas sejam interpretadas prematuramente.echo,
echo;
echo(
echo/
echo+
echo=
e na galeria de bandidosecho.
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,produziria como:
Agora, diga que você quer algo um pouco mais sofisticado, ...
Saídas
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áveln
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
fonte
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:
fonte
(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:
Resultado
fonte
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 .Se você precisar colocar resultados em um arquivo, poderá usar
fonte
Você também pode fazer assim,
A saída será,
Observe que quando isso é colocado em um arquivo em lotes, '%' deve ser duplicado.
fonte
*
charSe 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 temidaprocess_begin: CreateProcess(NULL, echo., ...) failed.
mensagem de erro.Espero que isso ajude pelo menos uma outra pessoa lá fora :)
fonte
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:
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
:Observe que essa barra invertida adicional não impedirá que o script analise \ n substring.
fonte
Isso funcionou para mim, sem necessidade de expansão atrasada:
Ele escreve uma saída como esta:
fonte
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:
fonte
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:
fonte
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.
fonte
ECHO ist eingeschaltet (ON).
não uma linha vazia, tentou no cmd promptEsta solução funciona (testada):
Isso converte avanços de linha isolados em combinação de avanço de linha de retorno de carro.
fonte
echo hello \n world
Não posso torná-lo mais simples do que:
fonte