배치 파일의 명령 출력에서 ​​동일한 행을 겹쳐 쓰는 방법


13

무언가를 할 때 마지막 줄을 대체하는 상태 정보를 작성하고 싶습니다.

다음 bat 파일 예제 에서 명령 출력의 동일한 행에서 텍스트 Step 2를 겹쳐 쓰려고 Step 1합니다.

echo off

echo Step 1
REM Do some stuff...

echo Step 2
REM do some other stuff...

답변:


8

이 스크립트는 당신이 요구 한 것을 정확하게 수행 할 것입니다 :

@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명령에 의해 제거됩니다 . 아, setXP와 이후 버전의 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...

2
나에게 이것은 단지 화면에 "단계 2"가 아닌 "단계 1 단계 2"를 인쇄합니다.
galmok

@galmok이 너무 나에게 발생하기 시작했다,하지만 난 확신 해요 (I 완벽하게 당신이 설명하는 동작으로 변경되었습니다. 최근에 넣어 작업에 사용하는 스크립트를 가지고)가 사용되지 않습니다 나타납니다 set명령은 지금 어떤 스트립 뒤에 CR 및 LF 문자 (공백 포함)가 =있습니다. 공백이 아닌 문자 =!ACSII_13!
timfoden

이 모든 것을 할 수있는 방법이 있습니다 ... 나는 실제로 다른 사람이 알아 차 렸는지 보려고 왔었습니다. 왜냐하면 그들이 얼마나 멀리 왔는지 발견하고 싶었 기 때문입니다. ... 스택 오버플로에 대한 답변을 작성할 수 있습니까? OR .. 질문처럼 바로 대답 하시겠습니까? 나는 당신이 그것으로 무엇을 할 수 있는지에 대한 질문 양식으로 그것을 쓸 수 있다고 생각합니다.
브렌트 리튼 하우스

! ASCII_13을 쓰십시오! 1 단계 이후 탈피를 방지하기 위해 2 단계에서 다음과 같이 코딩합니다.set /p "=Step 2 " <NUL
Zimba

6

질문에 대답하려면 :

@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 2End.

다시 돌아가서 백 스페이스 인 특수 ASCII 문자 8을 사용합니다. cmd로 작성하는 방법을 모르기 때문에 VBS Chr () 함수를 실행하고 백 스페이스 문자를 변수에 넣는 : EVALUATE 함수를 사용합니다 result. 누군가 더 나은 방법을 알고 있다면 조언하십시오.


1
PowerShell에서 $host.ui.RawUI.CursorPosition변수에 저장 하고 나중에 복원하여 커서가 현재 위치로 되돌아 가서 출력을 덮어 쓸 수 있습니다. PowerShell의 경우에만 옵션이지만 VBS보다 약간 더
깨끗할

4
@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의 답변이 효과가 없었습니다.


@timfoden의 답변은! CR 때문에 작동하지 않았습니다! 이전 단계의 끝에서 가야합니다. 또한 모든 % BSPACE % s 대신! CR! 공백으로 채우십시오.set /p "=.!CR!End. " <NUL&echo:
Zimba

3

당신은 할 수 없습니다. 일반적으로 파일에 캐리지 리턴 문자 (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은 단계 출력 전에 사용 하는 것입니다. 깜박이지만 항상 왼쪽 상단에 씁니다. 그리고 콘솔에서 볼 수 있었던 모든 것을 클로버 (그래서 내가 권하지 않는 이유); 대부분의 사용자는 그렇게 좋아하지 않습니다.


좋아, 나는 깨끗한 명령 줄로 할 수 없다는 의혹이 있었다. 유틸리티 가이 작업을 수행하도록하려면 전체를 유틸리티에 넣을 수도 있습니다. 내가 정말로 원했던 것은 5 초 동안 보이는 가시적 인 카운트 다운으로 끝날 때까지 매초마다 카운트 다운되었습니다.
awe

4
경외감 : Vista 이상인 경우 timeout 5작동합니다.
Joey

큰! 감사합니다! 타임 아웃 5가 작동합니다!
awe

4
처음으로 실제 문제를 게시 했어야했는데 ...
awe

물론 당신은 할 수; 1 단계 후에 캐리지 리턴을 추가하십시오! 또한, 다음은 텍스트 편집기없이 캐리지 리턴을 얻는 코드입니다.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Zimba

1

개행 문자를 가져오고 다음 단계를 작성하고 줄의 시작으로 돌아가 다음 줄을 작성하십시오.

@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남아 있습니다. 이 문제를 해결하는 방법을 잘 모르겠습니다.
Ste

다음 프롬프트에서 추가 공백 문자를 사용하면이 문제를 해결할 수 있습니다. 이전 문자를 포함합니다. 반대의 . 캐릭터 교환 . set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NULset /p "=Step 2!Newline!" <NULSPACE
Ste

이전 줄이 더 길면 공백을 추가하여 여분의 문자를 비우거나 공백을 줄 끝에서 처음으로 또는 공백을 추가하여 여분의 문자로 만듭니다.
짐바

0

curses또는 과 같은 화면 커서 라이브러리가 필요 ncurses하지만 사용에 지나치게 익숙하지 않습니다. 두 라이브러리는 Unix 시스템 용으로 개발되었지만 Windows 용 ( Cygwin 환경 또는 GnuWin32 ) 에 해당 라이브러리를 찾을 수 있습니다 .

DOS 스타일 배치 파일로 액세스하는 쉬운 방법을 모르겠습니다. 컴파일 된 언어로 프로그래밍하는 것이 좋습니다. Ncurses HOWTO 를 살펴보면 그것이 유용한 지 더 잘 알 수 있습니다.


저주는 터미널 및 터미널 에뮬레이터에 대해서만 상당합니다. 그들은 실제로 Windows의 기본 콘솔 API에 매핑되지 않습니다.
Joey

외부 라이브러리가 필요하지 않습니다. CMD 도구와 잘 작동합니다.
짐바

0

해결책 1

함께 메모장 + + 그것은 삽입 할 수있어 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

메모장 ++ 스크린 샷

Windows 배치 덮어 쓰기


산출

CMD 출력


해결책 2

또 다른 가능성은 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.