Script ini akan melakukan persis apa yang Anda minta:
@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...
Saya menemukan jawaban ini dengan melihat kode di perpustakaan manipulasi karakter skrip batch yang ditulis oleh Dave Benham disebut CharLib .
Perpustakaan ini mampu membuat semua karakter dalam kisaran 1..255.
Untuk info lebih lanjut, lihat utas yang berjudul "Apakah mungkin untuk mengubah karakter ke nilai ASCII-nya?"
Sunting 2017-4-26: Tampaknya kode di atas tidak lagi berfungsi . Saya tidak yakin kapan perilaku ini akan berubah, tetapi sudah pasti berhasil. The CR
karakter setelah =
sekarang akan dilucuti oleh set
perintah. Ah, tampaknya ada perubahan cara set
kerja antara XP dan versi Windows yang lebih baru. Lihat jawaban luar biasa pada baris Timpa di file kumpulan Windows? (duplikat) untuk detail lebih lanjut dan contoh kode tambahan.
Alternatif kemudian adalah menempatkan karakter non-spasi putih sebelum !ASCII_13!
dan mengaturnya untuk dihapus juga, mungkin juga dengan memasukkan spasi mundur (yang tidak dilucuti) diikuti oleh spasi atau dengan menambahkan spasi ke ujung string cepat (yang tidak dilucuti.)
Misal seperti ini:
@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
perintah itu sekarang menghapus semua Karakter CR dan LF (serta spasi) setelah=
. Coba letakkan karakter non-spasi putih antara=
dan!ACSII_13!
set /p "=Step 2 " <NUL
Untuk menjawab pertanyaan:
Keluaran:
Pada dasarnya, apa script tidak, adalah menulis
Step 1
, kemudian kembali satu tempat, menimpa1
, dan pada akhirnya pergi benar-benar kembali dan menimpaStep 2
denganEnd
.Ini akan kembali saya lakukan dengan karakter ASCII 8 khusus yang merupakan backspace. Karena saya tidak tahu bagaimana menulisnya dalam cmd, saya menggunakan fungsi: EVALUATE yang menjalankan fungsi VBS Chr (), dan menempatkan karakter backspace ke dalam variabel
result
. Jika seseorang tahu cara yang lebih baik, mohon saran.sumber
$host.ui.RawUI.CursorPosition
ke dalam variabel dan mengembalikannya nanti agar kursor melompat kembali ke tempat Anda berada dan menimpa output Anda. Hanya opsi untuk PowerShell, tetapi mungkin sedikit lebih bersih daripada barang VBS Anda :-)PENJELASAN:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
ini akan mengatur karakter backspace ke dalam variabel BSPACE. Sekarang untuk melihat hasilnya, ketik:
echo ab%BSPACE%c
keluaran:
ac
Anda dapat menggunakan variabel BSPACE ini lebih dari sekali untuk menghapus banyak karakter.
Sekarang, jika Anda ingin mengatur carriage return dalam variabel, gunakan
for /F "usebackq" %%a in (
copy / Z "% ~ dpf0" nul) DO (set "cr=%%a")
untuk melihat hasilnya, ketik:
setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***
hasilnya adalah:
***asfasdhlfashflkashflksa
@ davour jawaban di atas juga indah tetapi jawaban @ timfoden tidak bekerja untuk saya.
sumber
set /p "=.!CR!End. " <NUL&echo:
Kamu tidak bisa Biasanya Anda dapat mencapai hal semacam ini dengan memasukkan karakter carriage-return (0x0D) dalam file yang akan mengembalikan kursor ke kolom pertama di baris yang sama. Tetapi dalam kasus ini tidak berfungsi; CR hanya dimakan secara diam-diam.
Selanjutnya mendapatkan CR di sana agak rumit dan setidaknya di sini melibatkan editor teks. Saya sarankan Anda menulis sedikit program utilitas yang akan melakukan ini untuk Anda, sebenarnya tidak terlalu sulit. Program C kecil berikut mungkin sudah cukup (jika Anda tidak perlu Unicode):
Itu tidak lebih dari mencetak karakter CR dan kemudian teks yang Anda tentukan sebagai argumen pertama. Penggunaan sebagai berikut:
Baris terakhir adalah panggilan ke program itu. Baris kedua adalah idiom batch normal untuk mencetak teks tanpa jeda baris tambahan (yang penting dalam kasus ini karena jika tidak, Anda tidak dapat menimpa baris). Anda bisa menggunakan program di atas juga di tempat itu.
Cara hacky ringan, tetapi satu-satunya di mana Anda dapat yakin di mana Anda berakhir, akan digunakan
cls
sebelum output langkah Anda. Akan berkedip tetapi dengan cara itu Anda selalu menulis ke kiri atas. Dan mengalahkan segala sesuatu yang terlihat di konsol (itulah sebabnya saya tidak akan merekomendasikannya); sebagian besar pengguna tidak terlalu menyukainya.sumber
timeout 5
akan berfungsi.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Dapatkan karakter baris baru, tulis langkah berikutnya, kembali ke awal baris, tulis baris berikutnya:
sumber
Step 1
Step 2
Step 3
semuanya memiliki panjang yang sama. Jika bukan teks yangset /p
tersisa pertama . Tidak yakin bagaimana cara memperbaikinya.set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
sebagai kebalikan dariset /p "=Step 2!Newline!" <NUL
. TukarSPACE
untuk karakter.Anda perlu pustaka kursor layar suka
curses
atauncurses
, tapi saya tidak terlalu terbiasa dengan penggunaannya. Kedua perpustakaan dikembangkan untuk sistem Unix, tetapi Anda dapat menemukannya untuk Windows (di lingkungan Cygwin , atau GnuWin32 ).Saya tidak tahu cara mudah untuk mengaksesnya dalam file batch bergaya DOS. Anda mungkin lebih baik pemrograman dalam bahasa yang dikompilasi. Lihatlah Ncurses HOWTO untuk mendapatkan ide yang lebih baik tentang apakah itu akan berguna.
sumber
Solusi 1
Dengan Notepad ++ , Anda dapat memasukkan Backspace ←karakter (ASCII 0x08) secara langsung, menggunakan Panel Penyisipan Kode ASCII (Edit> Panel Karakter).
Solusi saya adalah memasukkan
[BS]
karakter secara langsung dan kemudian, seperti solusi lain yang diposting di sini, gunakan beberapa kali untuk menghapus karakter sebelumnya:Kode
Tangkapan layar Notepad ++
Keluaran
Solusi 2
Kemungkinan lain adalah menggunakan cecho (perintah gema dengan dukungan warna) untuk memasukkan Carriage Return ↵karakter unicode (U + 000D):
Kode
NB:
cecho_x64.exe
berjalan secara signifikan lebih cepat di mesin saya daripadacecho.exe
.sumber