Este script fará exatamente o que você pediu:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
set /p "=Step 1" <NUL
REM Do some stuff...
set /p "=!ASCII_13!Step 2" <NUL
REM do some other stuff...
Encontrei esta resposta examinando o código em uma biblioteca de manipulação de caracteres de script em lote escrita por Dave Benham chamada CharLib .
Esta biblioteca é capaz de criar todos os caracteres no intervalo de 1 a 255.
Para obter mais informações, consulte o tópico "É possível converter um caractere em seu valor ASCII?"
Editar 2017-4-26: Parece que o código acima não funciona mais . Não tenho certeza de quando esse comportamento teria mudado, mas definitivamente funcionava. O CR
personagem após o =
agora é retirado pelo set
comando. Ah, parece haver uma mudança na maneira como set
funciona entre o XP e versões posteriores do Windows. Veja a excelente resposta em Substituir linha no arquivo em lotes do Windows? (duplicado) para mais detalhes e exemplos adicionais de códigos.
Uma alternativa, então, é colocar um caractere que não seja um espaço em branco antes de !ASCII_13!
e providenciar para que ele seja apagado também, talvez inserindo um backspace (que não seja retirado) seguido por um espaço ou anexando espaços ao final do string de prompt (que não é removida.)
Por exemplo:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
set /p "=Step 1" <NUL
REM Do some stuff...
set /p "=x!ASCII_13!Step 2 " <NUL
REM do some other stuff...
set
comando agora retira qualquer Caracteres CR e LF (bem como espaços) após o=
. Tente colocar um caractere não-espaço em branco entre a=
ea!ACSII_13!
set /p "=Step 2 " <NUL
Para responder à pergunta:
Resultado:
Basicamente, o que o script faz, é gravações
Step 1
, em seguida, vai para trás um lugar, substituições1
, e no final vai completamente para trás e substituiStep 2
comEnd
.Voltando ao exemplo, o caractere ASCII especial 8, que é o backspace. Como não sei como escrevê-lo no cmd, uso a função: EVALUATE, que executa a função VBS Chr () e coloca o caractere backspace na variável
result
. Se alguém souber uma maneira melhor, por favor, informe.fonte
$host.ui.RawUI.CursorPosition
em uma variável e restaurá-la posteriormente, para que o cursor volte para onde estava e sobrescreva sua saída. Apenas uma opção para PowerShell, mas pode ser um pouco mais limpo do que o seu material VBS :-)EXPLICAÇÃO:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
isso definirá o caractere de backspace na variável BSPACE. Agora, para ver o resultado, digite:
echo ab%BSPACE%c
resultado:
ac
você pode usar essa variável BSPACE mais de uma vez para excluir vários caracteres.
Agora, se você deseja definir um retorno de carro em uma variável, use
for /F "usebackq" %%a in (
copiar / Z "% ~ dpf0" nulo) DO (set "cr=%%a")
para ver o resultado, digite:
setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***
a saída será:
***asfasdhlfashflkashflksa
A resposta de @ davour acima também é bonita, mas a resposta de @ timfoden não funcionou para mim.
fonte
set /p "=.!CR!End. " <NUL&echo:
Você não pode. Geralmente, você pode conseguir esse tipo de coisa incluindo um caractere de retorno de carro (0x0D) no arquivo que colocará o cursor de volta na primeira coluna na mesma linha. Mas neste caso, não funciona; o CR é comido silenciosamente.
Além disso, obter o CR é meio complicado e pelo menos aqui envolveu um editor de texto. Eu sugiro que você escreva um pequeno programa utilitário que faça isso por você, na verdade não é muito difícil. O pequeno programa C a seguir pode ser suficiente (se você não precisar de Unicode):
Não faz nada além de imprimir um caractere CR e, em seguida, o texto que você especificar como seu primeiro argumento. Uso da seguinte maneira:
A última linha é a chamada para esse programa. A segunda linha é o idioma normal do lote para imprimir texto sem quebras de linha à direita (o que é importante nesse caso, caso contrário, você não poderá sobrescrever a linha). Você também pode usar o programa acima nesse local.
Uma maneira levemente hacky, mas a única onde você pode ter certeza de onde acaba, seria usar
cls
antes da saída da etapa. Vai piscar, mas dessa forma você sempre escreve no canto superior esquerdo. E derrube tudo o que estava visível no console (e é por isso que eu não recomendo); a maioria dos usuários não gosta muito disso.fonte
timeout 5
funcionará.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Obter caracteres de nova linha, escreva o próximo passo, volte ao início da linha, escreva a próxima linha:
fonte
Step 1
Step 2
Step 3
todos tiverem o mesmo comprimento. Caso contrário, o texto do primeiroset /p
permanece. Não tenho certeza de como corrigir isso.set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
em oposição aset /p "=Step 2!Newline!" <NUL
. TroqueSPACE
pelo personagem.Você precisaria de uma biblioteca de cursor de tela como
curses
ouncurses
, mas não estou muito familiarizado com o uso deles. Ambas as bibliotecas foram desenvolvidas para sistemas Unix, mas você pode encontrá-las para Windows (no ambiente Cygwin ou GnuWin32 ).Não conheço nenhuma maneira fácil de acessá-los em um arquivo em lotes no estilo DOS. Pode ser melhor programar em uma linguagem compilada. Dê uma olhada no Ncurses HOWTO para ter uma idéia melhor de como será útil.
fonte
Solução 1
Com o Notepad ++ , é possível inserir o Backspace ←caractere (ASCII 0x08) diretamente, usando seu Painel de inserção de códigos ASCII (Editar> Painel de caracteres).
Minha solução é inserir o
[BS]
caractere diretamente e, como outras soluções postadas aqui, usá-lo várias vezes para excluir os caracteres anteriores:Código
Captura de tela do Notepad ++
Resultado
Solução 2
Outra possibilidade é usar cecho (comando echo com suporte a cores) para inserir a Carriage Return ↵como um caractere unicode (U + 000D):
Código
Nota:
cecho_x64.exe
roda significativamente mais rápido na minha máquina do quececho.exe
.fonte