예전의 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|작성자 모꼬모지
'컴!' 카테고리의 다른 글
배치파일: 변수 / 상수 정리 (0) | 2020.07.22 |
---|---|
배치파일: GOTO 문 (0) | 2020.07.22 |
배치파일 FOR 문 (0) | 2020.07.22 |
배치파일 IF 문 (0) | 2020.07.22 |
배치파일 기본 명령어 / 문법 (0) | 2020.07.22 |