컴!

배치파일: Choice 문

WWIII 2020. 7. 22. 15:43
728x90
반응형

예전의 MS-DOS 6 버전에는 CHOICE.COM (또는 CHOICE.EXE) 라는 이름으로 된 파일이 있었습니다. CHOICE 명령을 사용하여, 중요한 작업 직전에 사용자에게 Y/N 의 선택을 묻는 질문을 할 수 있었는데, 윈도우2000/XP 이상의 운영체제는 CHOICE 명령이 없어졌습니다.

환경변수의 값을 사용자로부터 입력받는 명령인 "set /p 변수명=" 명령을 이용하면 배치파일에서 Y/N 의 선택을 물을 수 있습니다.

배치 소스의 일부
:LOOP
set /p YN=(Y/N)?

if /i "%YN%" == "y" goto YES
if /i "%YN%" == "n" goto NO

goto LOOP

 

배치파일을 작성하다 보면, 사용자에게 무엇을 선택하게 해야 할 때가 있습니다. 즉 "예/아니오(Yes/No)" 등을 물어보아야 할 때가 있습니다.

가령 새 파일을 만들 때, 기존의 파일을 덮어쓸지 물어보아야 안전할 것입니다.

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


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이 아닌, 긴 문자열을 입력받는 방법은 여기에 있습니다:

 

배치 파일 안에서, 사용자로부터 어떤 문자열을 입력받아야 할 때에는

set /p <변수명>=

이라는 명령어를 사용하면 됩니다. 단, 윈도우2000/XP이상에서만 되고, 윈도우98에서는 되지 않습니다.


키보드로부터 문자열 입력 받기 예제
파일명: 0.bat

@echo off
setlocal

set /p str=아무 문자열이나 입력하세요:

echo 방금 입력하신 문자열은 %str% 입니다.



사용자가 키보드로 입력한 문자열이 str 이라는 변수에 저장됩니다. 변수에서 값을 꺼낼 때에는 %str% 이렇게 퍼센트 기호를 앞뒤로 붙입니다.

set /p str=
이렇게 하면 아무 문자열이나 입력하세요: 라는 문자열이 나타나지 않습니다.



실행 결과:

D:\Z>0.bat
아무 문자열이나 입력하세요:ABC
방금 입력하신 문자열은 ABC 입니다.


ABC 라는 문자열을 입력한 결과입니다.






이것은 좀더 실용적인 예제입니다. 사용자가 문자열을 입력하지 않고 그냥 엔터키만 누를 경우, 다시 입력받도록 합니다.

@echo off
setlocal

:: str 변수 초기화
set str=


:REDO
set /p str=문자열 입력하세요:
if "%str%" == "" goto REDO


echo 방금 입력하신 문자열은 %str% 입니다.



str 이라는 변수에 혹시 어떤 값이 이미 들어 있을 경우에는 문제가 생기므로 "set str=" 이렇게 변수를 초기화했습니다. 실은 초기화라기보다는 str 이라는 변수를 삭제한 것입니다.


예를 들어 도스창(명령 프롬프트)에서

dir /?


라고 하면 dir 명령에 대한 도움말이 나옵니다. "/?" 이 부분이 옵션입니다.


배치 파일에도 "실행시 옵션"을 붙여서 실행할 수 있습니다. 옵션을 "파라미터(Parameter)" 또는 "인수" 또는 "매개변수"라고 하기도 합니다.


첫번째 옵션은 %1
두번째 옵션은 %2
세번째 옵션은 %3
...
아홉번째 옵션은 %9
라는 기본 변수에 자동으로 저장됩니다. (9까지 있을 수 있음; 그리고 %0 에는 옵션이 아닌, 현재 배치파일명 자체가 들어 있음)


그리고 또한 %* 라는 기본 변수 속에는 %1~%9까지의 옵션들이 한꺼번에 들어 있습니다.




DOS BAT파일, 옵션(파라미터;인수) 처리 예제
파일명: 0.bat

아무 옵션도 주지 않고 0.bat 을 실행했을 때에는 에러 메시지를 출력하고
Google Yahoo MSN 이런 3개의 옵션을 주었을 때에는 그 3개의 옵션이 하나씩 출력되는 예제입니다.

@echo off
setlocal



if "%*" == "" goto ERROR

echo 옵션은 %1 그리고 %2 그리고 %3 입니다.
goto QUIT





:ERROR
echo [ 에러! 옵션을 입력하여 이 배치파일을 실행하세요 ㅎㅎ ]
goto QUIT



:QUIT





실행 결과:

D:\Z>0.bat
[ 에러! 옵션을 입력하여 이 배치파일을 실행하세요 ㅎㅎ ]
D:\Z>
D:\Z>
D:\Z>
D:\Z>0.bat Google Yahoo MSN
옵션은 Google 그리고 Yahoo 그리고 MSN 입니다.
D:\Z>



[출처] 배치화일 choice|작성자 모꼬모지

728x90
반응형

'컴!' 카테고리의 다른 글

배치파일: 변수 / 상수 정리  (0) 2020.07.22
배치파일: GOTO 문  (0) 2020.07.22
배치파일 FOR 문  (0) 2020.07.22
배치파일 IF 문  (0) 2020.07.22
배치파일 기본 명령어 / 문법  (0) 2020.07.22