답변:
이 스크립트는 당신이 요구 한 것을 정확하게 수행 할 것입니다 :
@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...
Dave Benham이 작성한 배치 스크립트 문자 조작 라이브러리에서 CharLib 이라는 코드를 보면이 대답을 찾았 습니다 .
이 라이브러리는 1..255 범위의 모든 문자를 생성 할 수 있습니다.
자세한 정보 는 "문자를 ASCII 값으로 변환 할 수 있습니까?" 라는 제목의 스레드를 참조하십시오.
2017-4-26 편집 : 위 코드가 더 이상 작동하지 않는 것 같습니다 . 이 동작이 언제 바뀌 었는지 잘 모르겠지만 확실히 작동했습니다. 이제 CR
이후 의 문자 =
가 set
명령에 의해 제거됩니다 . 아, set
XP와 이후 버전의 Windows에서 작동 하는 방식에 변화가있는 것으로 보입니다 . Windows 배치 파일의 덮어 쓰기 행에서 훌륭한 답변을 보 시겠습니까? 자세한 내용 및 추가 코드 예는 (중복) .
다른 방법은 공백이 아닌 문자를 앞에 넣고 공백이 !ASCII_13!
뒤 따르는 공백을 삽입하거나 공백의 끝에 공백을 추가하여 지우도록 정렬하는 것입니다. 프롬프트 문자열 (제거되지 않음)
예를 들면 다음과 같습니다.
@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
명령은 지금 어떤 스트립 뒤에 CR 및 LF 문자 (공백 포함)가 =
있습니다. 공백이 아닌 문자 =
와!ACSII_13!
set /p "=Step 2 " <NUL
질문에 대답하려면 :
@echo off
CALL :EVALUATE "chr(8)"
SET backspace=%result%
<nul set /p =Step 1
:: DO SOME STUFF....
<nul set /p =%backspace%
<nul set /p =2
:: DO SOME OTHER STUFF....
<nul set /p =%backspace%%backspace%%backspace%%backspace%%backspace%%backspace%
<nul set /p =End
GOTO:EOF
:EVALUATE -- evaluate with VBS and return to result variable
:: -- %~1: VBS string to evaluate
:: extra info: http://groups.google.com/group/alt.msdos.batch.nt/browse_thread/thread/9092aad97cd0f917
@IF [%1]==[] ECHO Input argument missing & GOTO :EOF
@ECHO wsh.echo "result="^&eval("%~1") > %temp%\evaluate_tmp_67354.vbs
@FOR /f "delims=" %%a IN ('cscript //nologo %temp%\evaluate_tmp_67354.vbs') do @SET "%%a"
@DEL %temp%\evaluate_tmp_67354.vbs
::ECHO %result%
@GOTO:EOF
산출:
End
기본적으로 스크립트가 무엇을하는지, 쓰기입니다 Step 1
다음, 다시 한 장소, 덮어 쓰기를 진행 1
하고, 마지막에 완전히 뒤로 덮어 간다 Step 2
와 End
.
다시 돌아가서 백 스페이스 인 특수 ASCII 문자 8을 사용합니다. cmd로 작성하는 방법을 모르기 때문에 VBS Chr () 함수를 실행하고 백 스페이스 문자를 변수에 넣는 : EVALUATE 함수를 사용합니다 result
. 누군가 더 나은 방법을 알고 있다면 조언하십시오.
$host.ui.RawUI.CursorPosition
변수에 저장 하고 나중에 복원하여 커서가 현재 위치로 되돌아 가서 출력을 덮어 쓸 수 있습니다. PowerShell의 경우에만 옵션이지만 VBS보다 약간 더
@echo off
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
<nul set /p =Step 1
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%
<nul set /p =2
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%
<nul set /p =3
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%%BSPACE%%BSPACE%%BSPACE%%BSPACE%%BSPACE%
<nul set /p =End.
pause
설명:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
백 스페이스 문자를 BSPACE 변수로 설정합니다. 결과를 보려면 다음을 입력하십시오.
echo ab%BSPACE%c
산출:
ac
이 BSPACE 변수를 여러 번 사용하여 여러 문자를 삭제할 수 있습니다.
변수에 캐리지 리턴을 설정하려면 다음을 사용하십시오.
for /F "usebackq" %%a in (
복사 / Z "% ~ dpf0"널) DO (set "cr=%%a")
결과를 보려면 다음을 입력하십시오.
setlocal EnableDelayedExpansion
& echo asfasdhlfashflkashflksa!CR!***
출력은 다음과 같습니다.
***asfasdhlfashflkashflksa
위의 @davour의 답변도 아름답지만 @timfoden의 답변이 효과가 없었습니다.
set /p "=.!CR!End. " <NUL&echo:
당신은 할 수 없습니다. 일반적으로 파일에 캐리지 리턴 문자 (0x0D)를 포함시켜 커서를 같은 행의 첫 번째 열에 다시 넣으면 이러한 종류의 작업을 수행 할 수 있습니다. 그러나이 경우에는 작동하지 않습니다. CR은 조용히 먹었습니다.
또한 CR을 얻는 것은 다소 까다 롭고 적어도 여기에는 텍스트 편집기가 포함되어 있습니다. 나는 당신을 위해 이것을 할 작은 유틸리티 프로그램을 작성하라고 제안한다. 실제로 그렇게 어렵지는 않다. 다음의 작은 C 프로그램으로 충분할 수 있습니다 (유니 코드가 필요하지 않은 경우).
#include <stdio.h>
int main(int argc, char* argv[]) {
if (argc < 2) return 1;
printf("\r%s", argv[1]);
}
CR 문자를 인쇄 한 다음 첫 번째 인수로 지정한 텍스트 만 인쇄합니다. 다음과 같이 사용법 :
@echo off
<nul set /P X=Step 1
pause>nul 2>nul
over.exe "Step 2"
마지막 줄은 해당 프로그램에 대한 호출입니다. 두 번째 줄은 줄 바꿈없이 텍스트를 인쇄하는 일반적인 배치 관용구입니다 (이 경우에는 줄을 덮어 쓸 수 없기 때문에 중요 함). 그래도 위의 프로그램을 그 장소에서도 사용할 수 있습니다.
약간 해키 된 방법이지만, 어디에서 끝나는 지 확신 할 수있는 유일한 방법 cls
은 단계 출력 전에 사용 하는 것입니다. 깜박이지만 항상 왼쪽 상단에 씁니다. 그리고 콘솔에서 볼 수 있었던 모든 것을 클로버 (그래서 내가 권하지 않는 이유); 대부분의 사용자는 그렇게 좋아하지 않습니다.
timeout 5
작동합니다.
for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
개행 문자를 가져오고 다음 단계를 작성하고 줄의 시작으로 돌아가 다음 줄을 작성하십시오.
@echo off
cls
setlocal enabledelayedexpansion
echo Here's how it's done:
for /f %%a in ('copy /Z "%~f0" nul') do set "Newline=%%a"
set /p "=Step 1!Newline!" <NUL
REM Do some stuff...
ping -n 2 localhost > nul
set /p "=Step 2!Newline!" <NUL
ping -n 2 localhost > nul
set /p "=Step 3 " <NUL
REM do some other stuff...
ping -n 2 localhost > nul
echo:
echo Done.
Step 1
Step 2
Step 3
모두 같은 길이 인 경우에만 작동합니다 . 그렇지 않은 경우 첫 번째 텍스트가 set /p
남아 있습니다. 이 문제를 해결하는 방법을 잘 모르겠습니다.
set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
set /p "=Step 2!Newline!" <NUL
SPACE
curses
또는 과 같은 화면 커서 라이브러리가 필요 ncurses
하지만 사용에 지나치게 익숙하지 않습니다. 두 라이브러리는 Unix 시스템 용으로 개발되었지만 Windows 용 ( Cygwin 환경 또는 GnuWin32 ) 에 해당 라이브러리를 찾을 수 있습니다 .
DOS 스타일 배치 파일로 액세스하는 쉬운 방법을 모르겠습니다. 컴파일 된 언어로 프로그래밍하는 것이 좋습니다. Ncurses HOWTO 를 살펴보면 그것이 유용한 지 더 잘 알 수 있습니다.
함께 메모장 + + 그것은 삽입 할 수있어 Backspace ←그 사용하여 직접 문자 (ASCII을 0x08) ASCII 코드 삽입 패널 (편집> 문자 패널).
내 해결책은 [BS]
문자를 직접 삽입 한 다음 여기에 게시 된 다른 솔루션과 마찬가지로 문자를 여러 번 사용하여 이전 문자를 삭제하는 것입니다.
암호
@ECHO OFF
SET "BACKSPACE_x7=[BS][BS][BS][BS][BS][BS][BS]"
SET /P "DUMMY_VAR=Step 1" < NUL
REM Do some stuff...
SET /P "DUMMY_VAR=%BACKSPACE_x7%Step 2" < NUL
REM Do some other stuff...
GOTO :EOF
메모장 ++ 스크린 샷
산출
또 다른 가능성은 cecho (색상 지원 에코 명령)를 Carriage Return ↵사용하여 유니 코드 문자 (U + 000D) 로 삽입하는 것입니다.
암호
@ECHO OFF
SET CARRIAGE_RETURN={\u000D}
cecho Step 1
REM Do some stuff...
cecho %CARRIAGE_RETURN%Step 2
REM Do some other stuff...
GOTO :EOF
NB : cecho_x64.exe
내 컴퓨터에서보다 훨씬 빠르게 실행됩니다 cecho.exe
.