Thursday, September 07, 2006
배치파일] Yes / No 선택 묻기, 도스의 CHOICE 명령 대용, 사용자 입력 받기 - DOS-Windows Batch File
배치파일을 작성하다 보면, 사용자에게 무엇을 선택하게 해야 할 때가 있습니다. 즉 "예/아니오(Yes/No)" 등을 물어보아야 할 때가 있습니다.
가령 새 파일을 만들 때, 기존의 파일을 덮어쓸지 물어보아야 안전할 것입니다.
MS-DOS 6에는 CHOICE.COM 또는 CHOICE.EXE 라는 명령어 파일이 있었습니다. 그래서 CHOICE 명령을 사용하여, 사용자에게 질문을 할 수 있었는데, 윈도우2000/XP 이상의 운영체제는 CHOICE 명령이 없었습니다.
물론 CHOICE 같이 간단한 명령은 'C언어'로 간단히 만들어서 쓸 수도 있겠지만, 그러면 호환성의 문제도 있고 하여, 다음과 같이 순수한 배치 파일로 구현해 보았습니다.
Windows 2000 / Windows XP 이상의 운영체제에는, set 명령에 /p 라는 옵션이 있습니다. 환경변수를 만들 때, 사용자에게 값을 실시간으로 지정하게 하는 것입니다.
예를 들어,
이렇게 하면, YN 이라는 환경변수에 어떤 값을 넣을지 직접 키보드로부터 입력을 받기 위해 대기합니다. 또한 동시에 (Y/N)? 이런 문자열을 출력하여 이해를 돕습니다.
사용자에게 Y 나 N 중의 하나를 입력하게 하고, 만약 엉뚱한 키를 누르면 다시 입력을 받도록 루프를 돌리면 됩니다.
yesNo.bat 이라는 예제인데 getKey.bat 으로 이름을 정해도 적당할 것입니다.
Y/N y/n 의 대소문자를 구분하지 않도록, if문에 /i 옵션을 주었습니다.
Y/N이 아닌, 긴 문자열을 입력받는 방법은 여기에 있습니다: ▶▶ 배치파일] 사용자 문자열 입력받기, 입력을 변수에 저장: DOS-NT Batch File Input String
가령 새 파일을 만들 때, 기존의 파일을 덮어쓸지 물어보아야 안전할 것입니다.
MS-DOS 6에는 CHOICE.COM 또는 CHOICE.EXE 라는 명령어 파일이 있었습니다. 그래서 CHOICE 명령을 사용하여, 사용자에게 질문을 할 수 있었는데, 윈도우2000/XP 이상의 운영체제는 CHOICE 명령이 없었습니다.
물론 CHOICE 같이 간단한 명령은 'C언어'로 간단히 만들어서 쓸 수도 있겠지만, 그러면 호환성의 문제도 있고 하여, 다음과 같이 순수한 배치 파일로 구현해 보았습니다.
Windows 2000 / Windows XP 이상의 운영체제에는, set 명령에 /p 라는 옵션이 있습니다. 환경변수를 만들 때, 사용자에게 값을 실시간으로 지정하게 하는 것입니다.
예를 들어,
set /p YN=(Y/N)?
이렇게 하면, YN 이라는 환경변수에 어떤 값을 넣을지 직접 키보드로부터 입력을 받기 위해 대기합니다. 또한 동시에 (Y/N)? 이런 문자열을 출력하여 이해를 돕습니다.
사용자에게 Y 나 N 중의 하나를 입력하게 하고, 만약 엉뚱한 키를 누르면 다시 입력을 받도록 루프를 돌리면 됩니다.
yesNo.bat 이라는 예제인데 getKey.bat 으로 이름을 정해도 적당할 것입니다.
@echo off
setlocal
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:LOOP
set /p YN=(Y/N)?
if /i "%YN%" == "y" goto YES
if /i "%YN%" == "n" goto NO
goto LOOP
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:YES
echo YES
goto QUIT
:NO
echo NO
goto QUIT
:QUIT
setlocal
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:LOOP
set /p YN=(Y/N)?
if /i "%YN%" == "y" goto YES
if /i "%YN%" == "n" goto NO
goto LOOP
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:YES
echo YES
goto QUIT
:NO
echo NO
goto QUIT
:QUIT
Y/N y/n 의 대소문자를 구분하지 않도록, if문에 /i 옵션을 주었습니다.
yesNo.bat 실행 결과
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?
(Y/N)?
(Y/N)?t
(Y/N)?
(Y/N)?
(Y/N)?y
YES
D:\Z>
D:\Z>
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?
(Y/N)?
(Y/N)?
(Y/N)?B
(Y/N)?
(Y/N)?n
NO
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?
(Y/N)?N
NO
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?Y
YES
D:\Z>
(Y/N)?
(Y/N)?
(Y/N)?
(Y/N)?t
(Y/N)?
(Y/N)?
(Y/N)?y
YES
D:\Z>
D:\Z>
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?
(Y/N)?
(Y/N)?
(Y/N)?B
(Y/N)?
(Y/N)?n
NO
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?
(Y/N)?N
NO
D:\Z>yesNo.bat
(Y/N)?
(Y/N)?Y
YES
D:\Z>
Y/N이 아닌, 긴 문자열을 입력받는 방법은 여기에 있습니다: ▶▶ 배치파일] 사용자 문자열 입력받기, 입력을 변수에 저장: DOS-NT Batch File Input String
tag: batch
배치파일 | DOS CMD BATCH .BAT
<< Home