Qual é o equivalente em lote do Windows ao comando shell do Linux echo -n
que suprime a nova linha no final da saída?
A idéia é escrever na mesma linha dentro de um loop.
windows
batch-file
cmd
newline
Gregseth
fonte
fonte
echo
poderia tomar-n
, mas nocmd.exe
ele simplesmente não iria funcionar ^^echo
poderia levar-n
" no contexto de uma pergunta relacionada ao Windows está incorreto.Respostas:
Usando
set
e o/p
parâmetro você pode ecoar sem nova linha:Fonte
fonte
<nul set /p =Hello
.set /p
não pode ecoar um sinal de igual como primeiro caractere nem espaços / tabulações.< nul
é um redirecionamento doNUL
dispositivo. Ele contém nada, mas isso é o suficiente paraset /p
parar de esperar pela entrada do usuárioUsando:
echo | set /p=
ou<NUL set /p=
ambos trabalharão para suprimir a nova linha.No entanto, isso pode ser muito perigoso ao escrever scripts mais avançados ao verificar ERRORLEVEL se tornar importante, pois a configuração
set /p=
sem especificar um nome de variável definirá ERRORLEVEL como 1.Uma abordagem melhor seria usar apenas um nome de variável fictícia da seguinte forma:
echo | set /p dummyName=Hello World
Isso produzirá exatamente o que você deseja, sem que ocorram coisas furtivas em segundo plano, como eu tive que descobrir da maneira mais difícil, mas isso só funciona com a versão canalizada;
<NUL set /p dummyName=Hello
ainda aumentará o ERRORLEVEL para 1.fonte
O método SET / P simples tem limitações que variam um pouco entre as versões do Windows.
As cotações principais podem ser removidas
Os espaços em branco à esquerda podem ser removidos
Leading
=
causa um erro de sintaxe.Consulte http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 para obter mais informações.
jeb postou uma solução inteligente que resolve a maioria dos problemas no texto Saída sem avanço de linha, mesmo com espaço à esquerda ou = Refinei o método para que ele possa imprimir com segurança absolutamente qualquer sequência de lotes válida sem a nova linha, em qualquer versão do Windows do XP em diante. Observe que o
:writeInitialize
método contém uma literal de seqüência de caracteres que pode não ser boa para o site. É incluída uma observação que descreve qual deve ser a sequência de caracteres.Os métodos
:write
e:writeVar
são otimizados de forma que somente as seqüências contendo caracteres iniciais problemáticos sejam gravadas usando minha versão modificada do método COPY da jeb. Strings não problemáticas são gravadas usando o método SET / P mais simples e rápido.fonte
ECHO.
, exceto queECHO.
pode falhar em circunstâncias obscuras . Existem várias outras formas que também podem falhar em situações obscuras. O único que sempre funciona éECHO(
.Como um adendo à resposta do @ xmechanix, notei escrevendo o conteúdo em um arquivo:
Isso adicionará um espaço extra ao 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:
Irá imprimir a sequência sem nenhum caractere de nova linha ou espaço no final.
fonte
World
e>
...set /p="abc"<nul|xxd -p
exibe616263
enquantoset /p=abc<nul|xxd -p
dá61626320
Uma solução para o espaço em branco despojado em SET / P:
o truque é o char de backspace que você pode chamar no editor de texto EDIT for DOS. Para criá-lo em EDIT, pressione ctrlP + ctrlH . Gostaria de colá-lo aqui, mas esta página não pode exibi-lo. No entanto, é visível no bloco de notas (era vazio, como um pequeno retângulo preto com um círculo branco no centro)
Então você escreve isso:
O ponto pode ser qualquer caractere, é só para informar ao SET / P que o texto começa ali, 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ê deve colocá-lo no lugar do 9 e ele excluirá o " . ", Após o qual você obterá o seguinte:
ao invés de:
Espero que ajude
fonte
Você pode remover a nova linha usando "tr" do gnuwin32 ( pacote coreutils )
A propósito, se você estiver executando muitos scripts, o gnuwin32 é uma mina de ouro.
fonte
trim
?\r
,\n
ou\r\n
(Novas linhas em OSX, POSIX e Windows, respectivamente) não são "espaço" caracteres.Aqui está outro método: ele usa o Powershell Write-Host que possui um parâmetro -NoNewLine, combina isso com
start /b
e oferece a mesma funcionalidade do lote.NoNewLines.cmd
Resultado
Este abaixo é um pouco diferente, não funciona exatamente como o OP deseja, mas é interessante porque cada resultado substitui o resultado anterior emulando um contador.
fonte
e também para ecoar começando com espaços
fonte
Talvez seja isso que você está procurando, é um roteiro da velha escola ...: P
ou talvez você esteja tentando substituir uma linha atual em vez de gravar em uma nova linha? você pode experimentar isso removendo o "% bs%" após o "." assinar e também espaçando os outros "% bs%" após a "mensagem de exemplo".
Acho isso realmente interessante porque usa uma variável para um propósito diferente do que se destina a fazer. como você pode ver, o "% bs%" representa um backspace. O segundo "% bs%" usa o backspace para adicionar espaços após a "mensagem de exemplo" para separar a "saída do comando Pause" sem realmente adicionar um caractere visível após a "mensagem de exemplo". No entanto, isso também é possível com um sinal de porcentagem regular.
fonte
set nl=^& echo.
truque em todos os lugares e o nome da variável é enganoso. % nl% não é um caractere de nova linha : ele se expande para&echo.
que, no final, você execute um novoecho
comando toda vez, daí a nova linha. Você pode conferir por escritoecho "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%"
. Você consegue"& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. "
, revelando o truque. A saída é a mesma, mas não pelos motivos sugeridos.cw.exe
Utilitário DIY (gravação no console)Se você não o encontrar pronto para o uso, pronto para uso, faça você mesmo. Com este
cw
utilitário, você pode usar todos os tipos de caracteres. Pelo menos, gostaria de pensar que sim. Faça um teste de estresse e me avise.Ferramentas
Tudo que você precisa é .NET instalado, o que é muito comum atualmente.
Materiais
Alguns caracteres digitados / copiados e colados.
Passos
.bat
arquivo com o seguinte conteúdo.Executá-lo.
Agora você tem um bom utilitário de 4KB para excluir o arquivo
.bat
.Alternativamente, você pode inserir este código como uma sub-rotina em qualquer lote, enviar o resultado
.exe
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ê deseja um retorno de carro (indo para o início da linha), execute apenas
cw
Então, tente isso na linha de comando:
fonte
Eu criei uma função com a idéia de @arnep:
Aqui está:
Use-o com
call :SL "Hello There"
Eu sei que isso não é nada de especial, mas demorei tanto tempo para pensar sobre isso, e pensei em publicá-lo aqui.
fonte
Exemplo 1: Isso funciona e produz o código de saída = 0. Isso é bom. Note o "." , diretamente após o eco.
Esta é uma mensagem exibida como Linux echo -n a exibirá ... 0
Exemplo 2: Isso funciona, mas produz o código de saída = 1. Isso é ruim. Observe a falta de ".", Após o eco. Essa parece ser a diferença.
Esta é uma mensagem exibida como Linux echo -n mostraria ... 1
fonte
Inspirado nas respostas a essa pergunta, criei um script simples de contra-lote que continua imprimindo o valor do progresso (0-100%) na mesma linha (substituindo o anterior). Talvez isso também seja valioso para quem procura uma solução semelhante.
Observação :
*
os caracteres não são imprimíveis e devem ser inseridos usando a combinação de teclas [Alt
+Numpad 0
+Numpad 8
], que é obackspace
caractere.fonte
Eu acredito que não existe essa opção. Como alternativa, você pode tentar isso
fonte
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 memória e armazenar o que deseja imprimir nela, para poder imprimir a variável em vez da frase. Por exemplo:
Dessa forma, você pode imprimir qualquer coisa sem uma nova linha. Eu criei o programa para imprimir os caracteres um por um, mas você também pode usar palavras em vez de caracteres alterando o loop.
No exemplo acima, usei "enabledelayedexpansion" para que o comando set / p não reconheça "!" caractere e imprime um ponto em vez disso. Espero que você não tenha o uso do ponto de exclamação "!" ;)
fonte
Resposta tardia aqui, mas para quem precisar escrever caracteres especiais em uma única linha que ache a resposta do dbenham com cerca de 80 linhas demais e cujos scripts possam ser interrompidos (talvez devido à entrada do usuário) sob as limitações de simplesmente usar
set /p
, é provavelmente mais fácil apenas para emparelhar o .bat ou .cmd com um compilado C ++ ou executável em linguagem C e depois é sócout
ouprintf
os personagens. Isso também permitirá que você escreva facilmente várias vezes em uma linha se estiver mostrando uma espécie de barra de progresso ou algo usando caracteres, como aparentemente o OP.fonte
printf
A partir de umcmd
painel Win-7, dá-me"'printf' is not recognized as an internal or external command, operable program or batch file."
printf
não é nativo do Windows. Esta é uma pergunta do Windows.