Substituir linha no arquivo em lotes do Windows? [duplicado]

1

Pouco antes de dizer algo, tentei este código:

@echo off

setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"

set /p "=Example 1" <NUL

set /p "=!ASCII_13!Example 2" <NUL

Minha fonte: Como Sobrescrever a mesma linha na saída do comando do arquivo de lote (A resposta verificada a partir dele)

E isso não funcionou para mim. Acabou de ser apresentado como Example 1Example 2 quando o testei.

Então, eu só preciso de uma maneira de substituir a mesma linha em um arquivo de lote (por exemplo, ele disse "Exemplo 1" antes, mas depois disso a linha dirá "Exemplo 2").

Obrigado!

    
por MysteryBlokHed 12.01.2017 / 21:35

2 respostas

2

<nul set /p=text é um truque para fazer o eco de uma string (o prompt de texto) sem uma linha no final, para que o cursor permaneça na mesma linha e possamos retornar ao início da linha (enviando uma linha retorno) para sobrescrevê-lo.

O problema encontrado com a resposta indicada é a mudança de comportamento no set /p . Até o Windows XP, o comando set /p conseguiu ecoar os espaços no início do prompt de texto, mas os caracteres brancos do Vista foram removidos do início do prompt. Você não pode enviar o retorno de carro no início da string. Mas você pode usá-lo em outro lugar

@echo off
    setlocal enableextensions enabledelayedexpansion

    for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

    <nul set /p"=This is the line 1 !CR!"
    <nul set /p"=This is the line 2 "

Ou seja, em vez de enviar o CR no início de uma linha, envie-o no final da linha anterior.

Outra opção é incluir um caractere diferente como o início do prompt de texto antes do CR . A inclusão de um caractere visível gera outro problema, pois ele deve ser substituído na próxima linha para que não seja visível. Um backspace (ascii 0x08 ) é uma opção segura (geralmente)

@echo off
    setlocal enableextensions enabledelayedexpansion

    for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
    for /f %%a in ('"prompt $H&for %%b in (0) do rem"') do set "BS=%%a"

    <nul set /p"=This is the line 1"
    <nul set /p"=!BS!!CR!This is the line 2"
    
por 13.01.2017 / 09:04
0

Desde o Windows 10 Treshold2, o console entende o Códigos de escape Ansi
Esses códigos exigem o hex de char de escape 0x1b ou decimal 27, que é
difícil de gerar (depende do seu editor)

O código para ir para a primeira coluna e n linhas para cima é ESC[nF
O código para excluir até o final da linha é ESC[0J

Estes dois códigos juntos (um alinhamento):

    esc [ 1  F  esc [ 0  J  
hex 1B 5B 31 46 1B 5B 30 4A  

Este lote usa o certutil para decodificar uma string hex para ascii aqui

@echo off
echo 1B 5B 31 46 1B 5B 30 4A>Ansi.hex
Del Ansi.bin
certutil -decodehex Ansi.hex Ansi.bin >NUL 2>&1
Set /P Ansi=<Ansi.bin

Echo First Line extra long to see it's deleted
Timeout /t 3 >Nul
Echo %Ansi%Second Line
Timeout /t 3 >Nul
Echo %Ansi%Third Line
Timeout /t 3 >Nul
Echo %Ansi%Fourth Line
    
por 13.01.2017 / 01:49