Lote do Windows: echo sem nova linha

Qual é o equivalente em lote do Windows do comando shell do Linux echo -n que suprime a nova linha no final da saída?

A ideia é escrever na mesma linha dentro de um loop.

Usando set e o parâmetro /p você pode fazer eco sem nova linha:

 C:\> echo Hello World Hello World C:\> echo|set /p="Hello World" Hello World C:\> 

Fonte

Usando: echo | set /p= echo | set /p= ou ambos funcionam para suprimir a nova linha.

No entanto, isso pode ser muito perigoso ao escrever scripts mais avançados quando a verificação do ERRORLEVEL se torna importante, pois a configuração de set /p= sem especificar um nome de variável definirá o ERRORLEVEL como 1.

Uma abordagem melhor seria apenas usar um nome de variável fictício da seguinte forma:
echo | set /p dummyName=Hello World

Isso produzirá exatamente o que você quer, sem qualquer coisa furtiva acontecendo no fundo, pois eu tive que descobrir da maneira mais difícil, mas isso só funciona com a versão canalizada; , ainda elevará o ERRORLEVEL para 1.

O método SET / P simples tem limitações que variam ligeiramente entre as versões do Windows.

  • Cotações principais podem ser retiradas

  • Espaço em branco principal pode ser removido

  • Entrelinha = causa um erro de syntax.

Veja http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 para mais informações.

jeb postou uma solução inteligente que resolve a maioria dos problemas no texto de saída sem alimentação de linha, mesmo com espaço na liderança ou = eu refinei o método para que ele possa imprimir com segurança absolutamente qualquer seqüência de lote válida sem a nova linha, em qualquer versão do Windows do XP em diante. Observe que o método :writeInitialize contém um literal de string que pode não ser bem publicado no site. Uma observação é incluída, descrevendo qual deve ser a seqüência de caracteres.

Os methods :write e :writeVar são otimizados de tal forma que somente strings contendo caracteres :writeVar problemáticos são gravados usando minha versão modificada do método COPY do jeb. Strings não problemáticas são escritas usando o método SET / P mais simples e rápido.

 @echo off setlocal disableDelayedExpansion call :writeInitialize call :write "=hello" call :write " world!%$write.sub%OK!" echo( setlocal enableDelayedExpansion set lf=^ set "str= hello!lf!world^!!!$write.sub!hello!lf!world" echo( echo str=!str! echo( call :write "str=" call :writeVar str echo( exit /b :write Str :: :: Write the literal string Str to stdout without a terminating :: carriage return or line feed. Enclosing quotes are stripped. :: :: This routine works by calling :writeVar :: setlocal disableDelayedExpansion set "str=%~1" call :writeVar str exit /b :writeVar StrVar :: :: Writes the value of variable StrVar to stdout without a terminating :: carriage return or line feed. :: :: The routine relies on variables defined by :writeInitialize. If the :: variables are not yet defined, then it calls :writeInitialize to :: temporarily define them. Performance can be improved by explicitly :: calling :writeInitialize once before the first call to :writeVar :: if not defined %~1 exit /b setlocal enableDelayedExpansion if not defined $write.sub call :writeInitialize set $write.special=1 if "!%~1:~0,1!" equ "^!" set "$write.special=" for /f delims^=^ eol^= %%A in ("!%~1:~0,1!") do ( if "%%A" neq "=" if "!$write.problemChars:%%A=!" equ "!$write.problemChars!" set "$write.special=" ) if not defined $write.special ( "%$write.temp%_1.txt" (echo !str!!$write.sub!) copy "%$write.temp%_1.txt" /a "%$write.temp%_2.txt" /b >nul type "%$write.temp%_2.txt" del "%$write.temp%_1.txt" "%$write.temp%_2.txt" set "str2=!str:*%$write.sub%=%$write.sub%!" if "!str2!" neq "!str!"  or 0x1A :: :: $write.problemChars - list of characters that cause problems for SET /P ::     <0xFF>   :: Note that  and  also causes problems, but are handled elsewhere :: set "$write.temp=%temp%\writeTemp%random%" copy nul "%$write.temp%.txt" /a >nul for /f "usebackq" %%A in ("%$write.temp%.txt") do set "$write.sub=%%A" del "%$write.temp%.txt" for /f %%A in ('copy /z "%~f0" nul') do for /f %%B in ('cls') do ( set "$write.problemChars=%%A%%B  "" REM the characters after %%B above should be   <0xFF> ) exit /b 

Uma solução para o espaço em branco despojado em SET / P:

O truque é aquele char de backspace que você pode invocar no editor de texto EDIT for DOS. Para criá-lo em EDIT, pressione ctrlP + ctrlH . Eu iria colá-lo aqui, mas esta página não pode exibi-lo. É visível no bloco de notas (é werid, como um pequeno retângulo preto com um círculo branco no centro)

Então você escreve isso:

  

O ponto pode ser qualquer caractere, ele está lá apenas para dizer ao SET / P que o texto começa lá, antes dos espaços, e não no " Hello ". O " 9 " é uma representação do caractere de backspace que não posso exibir aqui. Você tem que colocá-lo em vez do 9, e ele irá apagar o " . ", Após o qual você terá isso:

  Hello Everyone 

ao invés de:

 Hello Everyone 

Espero que ajude

Você pode remover a nova linha usando “tr” do gnuwin32 (pacote coreutils )

 @echo off set L=First line echo %L% | tr -d "\r\n" echo Second line pause 

A propósito, se você estiver fazendo muitos scripts, o gnuwin32 é uma mina de ouro.

Como um adendo à resposta do @xmechanix, notei escrevendo o conteúdo em um arquivo:

 echo | set /p dummyName=Hello World > somefile.txt 

Isso adicionará um espaço extra no final da string impressa , o que pode ser inconveniente, especialmente porque estamos tentando evitar adicionar uma nova linha (outro caractere de espaço em branco) ao final da string.

Felizmente, citando a string a ser impressa, ou seja, usando:

 echo | set /p dummyName="Hello World" > somefile.txt 

Irá imprimir a string sem qualquer caractere de nova linha ou espaço no final.

Aqui está outro método, ele usa o Powershell Write-Host, que tem um parâmetro -NoNewLine, combina isso com start /b e oferece a mesma funcionalidade do batch.

NoNewLines.cmd

 @ECHO OFF start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - ';Write-Host -NoNewLine 'Result 2 - ';Write-Host -NoNewLine 'Result 3 - '" PAUSE 

Saída

 Result 1 - Result 2 - Result 3 - Press any key to continue . . . 

Este abaixo é um pouco diferente, não funciona exatamente como o OP quer, mas é interessante porque cada resultado sobrescreve o resultado anterior emulando um contador.

 @ECHO OFF start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 2 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 3 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 4 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 5 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 6 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 7 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 8 - '" start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 9 - '" PAUSE 

Talvez seja isso que você está procurando, é um roteiro da velha escola …: P

 set nl=^& echo. echo %nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl% echo only in prompt. pause 

ou talvez você esteja tentando replace uma linha atual em vez de escrever para uma nova linha? Você pode experimentar isso removendo o “% bs%” após o “.” assinar e também espaçando o outro “% bs%” após o “Exemplo de mensagem”.

 for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "bs=%%a"  

Acho isso muito interessante porque usa uma variável para um propósito diferente do que se pretende fazer. como você pode ver, o "% bs%" representa um backspace. O segundo "% bs%" usa o backspace para adicionar espaços após o "Exemplo de mensagem" para separar o "Pausar a saída do comando" sem realmente adicionar um caractere visível após o "Exemplo de mensagem". No entanto, isso também é possível com um sinal de porcentagem regular.

Daqui

  

e também para echo começando com espaços de uso

 echo.Message goes here 

cw.exe DIY cw.exe (gravação de console)

Se você não o encontrar pronto para uso, você pode fazer bricolagem. Com este utilitário cw você pode usar todos os tipos de caracteres. Pelo menos, eu gostaria de pensar assim. Por favor, faça um teste de estresse e me avise.

Ferramentas

Tudo que você precisa é o .NET instalado, o que é muito comum hoje em dia.

Materiais

Alguns caracteres typescripts / copiados e colados.

Passos

  1. Crie o arquivo .bat com o seguinte conteúdo.
 /* >nul 2>&1 @echo off setlocal set exe=cw for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do set "csc=%%v" "%csc%" -nologo -out:"%exe%.exe" "%~f0" endlocal exit /b %errorlevel% */ using System; namespace cw { class Program { static void Main() { var exe = Environment.GetCommandLineArgs()[0]; var rawCmd = Environment.CommandLine; var line = rawCmd.Remove(rawCmd.IndexOf(exe),exe.Length).TrimStart('"'); line = line.Length < 2 ? "\r" : line.Substring(2) ; Console.Write(line); } } } 
  1. Executá-lo.

  2. Agora você tem um bom utilitário 4KB para poder excluir o .bat .

Alternativamente, você pode inserir este código como uma sub-rotina em qualquer lote, enviar o .exe resultante para %temp% , usá-lo em seu lote e excluí-lo quando estiver pronto.

Como usar

Se você quiser escrever algo sem nova linha:
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".

Se você quiser um retorno de carro (indo para o início da linha), corra apenas
cw

Então tente isso na linha de comando:

 for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw) 

Você pode suprimir a nova linha usando o comando set / p. O comando set / p não reconhece um espaço, para isso você pode usar um ponto e um caractere de backspace para fazê-lo reconhecê-lo. Você também pode usar uma variável como memory e armazenar o que deseja imprimir nela, para poder imprimir a variável em vez da frase. Por exemplo:

 @echo off setlocal enabledelayedexpansion for /f %%a in ('"prompt $H & for %%b in (1) do rem"') do (set "bs=%%a") cls set "var=Hello World! :)" set "x=0" :loop set "display=!var:~%x%,1!" nul set /a "x=%x% + 1" if "!var:~%x%,1!" == "" goto end goto loop :end echo. pause exit 

Desta forma, você pode imprimir qualquer coisa sem uma nova linha. Eu fiz o programa para imprimir os caracteres um por um, mas você pode usar palavras também em vez de caracteres, alterando o loop.

No exemplo acima, usei “enabledelayedexpansion” para que o comando set / p não reconheça “!” personagem e imprime um ponto em vez disso. Espero que você não tenha o uso do ponto de exclamação “!” 😉

Exemplo 1: Isso funciona e produz código de saída = 0. Isso é bom. Note o “.” , diretamente após o eco.

C: \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ scripts #
@echo. set / p JUNK_VAR = Esta é uma mensagem exibida como o echo do Linux -n a exibiria … & echo% ERRORLEVEL%

Esta é uma mensagem exibida como o Linux echo -n iria exibi-lo … 0

Exemplo 2: Isso funciona, mas produz código de saída = 1. Isso é ruim. Por favor, note a falta de “.”, Após o eco. Essa parece ser a diferença.

C: \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ scripts #
@echo | set / p JUNK_VAR = Esta é uma mensagem exibida como o echo do Linux -n a exibiria … & echo% ERRORLEVEL%

Esta é uma mensagem exibida como o Linux echo -n iria exibi-lo … 1

Eu acredito que não há essa opção. Alternativamente, você pode tentar isso

 set text=Hello set text=%text% world echo %text% 

Resposta tardia aqui, mas para quem precisa escrever caracteres especiais para uma única linha que acha que a resposta de dbenham tem cerca de 80 linhas muito longas e cujos scripts podem quebrar (talvez devido à input do usuário) sob as limitações de simplesmente usar set /p , é provavelmente mais fácil apenas emparelhar o seu .bat ou .cmd com um executável em linguagem C ++ ou C compilado e, em seguida, apenas cout ou printf os caracteres. Isso também permitirá que você escreva facilmente várias vezes em uma linha se estiver mostrando uma barra de progresso ou algo usando caracteres, como o OP aparentemente era.

Eu fiz uma function da idéia do @arnep:

echo | set / p = “Olá mundo”

Aqui está:

 :SL (sameline) echo|set /p=%1 exit /b 

Use-o com a call :SL "Hello There"
Eu sei que isso não é nada de especial, mas eu demorei tanto para pensar nisso que achei que iria postar aqui.

você pode usar o comando substituto printf ou print e usar o retorno de carro nele para conseguir isso

ex: printf “Olá mundo \ r”

A syntax completa está disponível aqui: http://wiki.bash-hackers.org/commands/builtin/printf