Callisto
Jupiter
간단한 배치파일 사용법
반응형

저는 배치파일을 잘 하는 사람은 아닙니다. 다만 제가 여러 배치파일의 스크립트를 보고 제가 사용하기에 불편하지 않게 몇가지 만들어보면서 그냥 조금이라도 알려드리면 좋겠다 싶어서 간단히 포스팅 합니다. 참고로 배치파일 문법의 도움말을 참고하시면 좋습니다.

 

배치파일로 만들 수 있는 프로그램은 무궁무진합니다. 기본적인 명령 프롬프트 명령부터 시작해서 DISM과 같은 GUI가 없는 툴, 자주 사용하지 않겠지만 압축되어 있는 수십가지의 파일들을 알아서 풀 수 있도록 하는 배치파일 등..

 

MDL의 aboddi1406의 ESD > ISO 스크립트를 이용해서 설명해 드리도록 하겠습니다.

 

 

 

도움말을 활용하자

 

명령 프롬프트를 실행하고 for, if, set과 관련한 도움말을 보고 싶다면 'for /?'와 같이 입력하시면 주룩 나옵니다.

 

 

계속하려면 아무 키나 누르십시오... 라고 나올텐데 도움말의 길이가 매우 길면 보기 힘드니 'for /? > for_help.txt' 내보내기하여 텍스트 파일로 도움말을 읽어보면 됩니다. 기본적으로 명령 프롬프트를 관리자 권한없이 실행하면 사용자 이름 폴더가 기본 루트가 되기 때문에 사용자 이름 폴더에 저장이 됩니다.

 

 

PUSHD

 

명령이 실행되는 기본 폴더를 지정하는 명령입니다. 제가 배치파일을 만들어서 다른 사람도 사용할 수 있게 공유를 하였는데 무조건 바탕 화면에서 실행이 된다는 보장도 없고 다른 경로에서도 실행이 되니까 항상 실행되는 위치에서 명령이 시작되도록 하는 것입니다.

 

보통 cd /d %~dp0를 배치파일이 실행되는 위치에서 명령이 이루어지게 배치파일 처음 부분에 쓰는 편입니다.

 

 

TITLE

 

배치파일의 창 제목을 설정하는 명령입니다.

 

TITLE ESD ^> ISO

 

>는 명령을 내보내기 하는 것이므로 실제로 TITLE ESD > ISO로 쓰게 되면 안됩니다.

 

^를 앞에 붙여주면 아래 그림과 같이 나옵니다.

 

 

다만 >와 배치파일 명령에 포함되는 문자를 사용하지 않을 경우에는 그냥 ^없어도 됩니다.

 

ECHO

 

echo는 화면에 메시지를 출력해주는 명령입니다. 다수의 프로그램 명령이 보이지 않도록 @echo off를 적어주지만 이 경우에는 명령들이 보이지 않지만 사용자가 직접 echo를 출력한다면 그 부분은 echo가 나옵니다.

 

@echo off

rem script:     abbodi1406, adguard
rem esddecrypt: qad, @tfwboredom
rem wimlib:     synchronicity
rem cryptokey:  MrMagic, Chris123NT, mohitbajaj143, Superwzt, timster 

 

처음 부분에 @echo off가 되어 있습니다. 그리고

 

set arch=x64

set langid=KO-KR

set _ver=6.2.9600

set svcbuild=17031

 

echo      Arch: %arch%
echo  Language: %langid%
echo   Version: %_ver%.%svcbuild%
echo.
echo Press any key to continue...
pause >nul
GOTO :MAINMENU 

 

어떤 특정한 정보를 알려야 할 경우에는 echo로 입력하여 나타낼 수 있습니다. 그리고 빈줄을 넣으려면 echo.를 쓰면 됩니다. 그리고 다음 단계로 넘어갈 때 cls로 화면을 지운 다음에 그 다음 명령을 처리하게 할 수도 있습니다. 보통 goto :aaa와 같은 다음 명령으로 넘어갈 때에 많이 씁니다.

 

 

COLOR

 

배치파일의 배경색과 글자색을 설정하는 명령입니다.

 

그렇게 많이 사용하는 용도는 아닙니다. 다만 칙칙한 검은 배경과 회색 글자보다는 파란 배경에 흰 글자를 많이 사용하는 편입니다.

 

0 = 검정색    8 = 회색

1 = 파랑색    9 = 연한 파랑색

2 = 초록색    A = 연한 초록색

3 = 옥색       B = 연한 옥색

4 = 빨강색    C = 연한 빨강색

5 = 자주색    D = 연한 자주색

6 = 노랑색    E = 연한 노랑색

7 = 흰색       F = 밝은 흰색

 

color 1f로 한다면 배경은 파랑색, 문자는 밝은 흰색 문자색을 나타냅니다.

 

 

SET

 

set aaa=bbb 처럼 환경 변수에 저장하는 명령입니다. aaa는 변수이고 bbb는 문자열 입니다.

 

홀로쓰이는 경우도 있고 for /f "tokens"와 if에서 특정한 경우가 생기면 set할때도 쓰입니다.

 

SET Backup=OFF
SET ENCRYPTEDESD=
SET ERRORTEMP=
SET ENCRYPTED=0
SET MULTI=0
SET PREPARED=0
set VOL=0
SET "ramdiskoptions={7619dcc8-fafe-11d9-b411-000476eba25f}"
set newkeys=0 

 

ESD > ISO 배치파일 처음 부분에 선언된 set 명령입니다. 기본적으로 공백이나 0으로 되어 있고 ramdiskoptions에 "로 묶여 있기도 합니다. "로 묶는 것은 혹시 잘못된 문자열이 변수에 저장되는 것을 방지하기 위함입니다. 그리고 이 저장된 변수를 사용하려면 %로 묶어서 사용하면 됩니다.

 

set MULTI=1

 

echo.
echo ============================================================
echo Creating %WIMFILE%...
echo ============================================================
echo.
IF %MULTI%==0 (set sourcetime=4) else (set sourcetime=%MULTI%) 

 

if %MULTI%==0 이면 sourcetime에 4를 저장하고 아니면 0이 아닌 다른 수를 sourcetime에 저장합니다. 먼저 선언된 set이기 때문에 배치파일이 처리 중일때 %MULTI%부분을 확인해서 그에 따른 set을 하는 모습입니다.

 

set /a는 기호의 오른쪽에 있는 문자열에 수식을 지정하는 것입니다.

 

set a=4

set /a a=a+6

echo %a%

 

위 명령의 값은 10이 나옵니다. 문자열이 수식으로 되어 있기 때문에 /a를 붙여준 것입니다. 수식을 간단히 하는 방법도 있긴 합니다.

 

set /p는 미리 set aaa=을 써놓고 입력을 받아 변수를 저장하는 명령입니다. set /p aaa=명령 이런 식입니다.

 

set imageno=
set /p imageno=이미지 번호 :  

 

set /p imageno=이미지 번호 : 이런식으로 하면서 배치파일 실행시 1을 입력하고 엔터를 누르면 imageno에 1이라는 변수가 저장됩니다.

 

%cd%, %date%, %time%, %random%, %errorlevel%, %cmdextversion%, %cmdcmdline%, %highestnumanodenumber%는 set dddd=%date%와 같이 그때의 그 값을 dddd에 저장합니다. %date%니까 현재 날짜가 dddd에 저장되는 것입니다.

 

 

SETLOCAL

 

set과 같이 사용되는 지연된 환경 변수 사용 명령입니다.

 

 for %%b in (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do set langid=!langid:%%b=%%b!

 

그냥 명령을 실행하게 되면 %%b가 A로 치환되어 마지막에만 for문을 빠져나와 Z가 출력됩니다. 이것을 방지하기위해 setlocal EnableDelayedExpansion을 입력하여 지연된 환경 변수 사용을 해주면 A부터 Z까지 모두 출력됩니다.

 

이 경우에는 활용하는 부분이 다 다르기 때문에 어떻게 사용하느냐에 따라 다르게 쓰일 수가 있습니다.

 

 

IF~ELSE

 

IF~ELSE는 여러 프로그래밍 언어와 같이 조건을 처리하는 명령입니다. 꼭 ELSE가 필요한 것은 아니므로 하나의 명령으로 끝을 낼수도 있습니다. 원래 그렇듯이 for와 같이 사용가능합니다.

 

set MUTLI=5

 

IF NOT %MULTI%==0 GOTO :MAINMENU 

 

set에서 저장한 %MULTI%가 0이 아니면(이때 수식으로 0이 아니라 단순 문자열 비교, 다만 이때는 IF NOT %MULTI% EQU 0도 사용 가능) :MAINMENU로 가능 명령입니다.

 

IF EXIST "CALLISTO.TXT" set jupiter=Callisto와 같이 파일이 존재하는지에 따라 set을 하거나 set jupiter=Callisto대신 ren callisto.txt jupiter.txt와 같은 이름 변경 명령, for /f "tokens=1 delims= " %%i in ('jupiter.txt ^| find /i "callisto"') do echo %%i와 같은 명령으로 할 수도 있습니다. /i는 대소문자 구별하지 않는다는 것입니다.

 

IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.

 

filename.이 존재하면 filename.을 제거하고 없다면(ELSE) filename. missing.이라는 에코를 출력합니다.

 

EQU - 같음
NEQ - 같지 않음
LSS - 보다 작은
LEQ - 작거나 같음
GTR - 보다 큰
GEQ - 크거나 같음

 

if 명령에서 사용할 수 있는 비교 연산자입니다.

 

if %ERRORLEVEL% EQU 1 (

set lang=ko-kr&set intl=korean goto :korean

) else (

exit

)

 

ERRORLEVEL은 마지막 프로그램 실행에서 반환된 마침 코드가 지정된 숫자보다 크거나 같으면 조건을 참으로 지정합니다. 위 명령처럼 만약 ERRORLEVEL이 1과 같다면(이때 if %ERRORLEVEL%==1도 사용 가능합니다.) lang에 ko-kr, intl에 korean을 저장하고 :korean으로 갑니다. 아니라면 종료합니다. C언어에서 ,로 변수들을 한 행에 쓰고 VB 2010에서 :를 쓰는 것처럼 배치파일에서도 &를 사용합니다.

 

 

FOR

 

IF~ELSE와 함께 배치파일에서 가장 많이 쓰는 명령일 것입니다.

 

가장 많이 쓰이는 FOR는 /L 옵션과 /F 옵션입니다.

 

기본 FOR 명령

 

 FOR %변수 IN (집합) DO 명령어 [명령어 매개 변수]

 

배치파일에서는 %변수는 허용하지 않습니다. %%변수를 사용해야 합니다. 그리고 %%A와 %%a는 전혀 다릅니다.

 

%%변수는 %%i와 같이 정의할 수 있으며 (집합) 부분에는 어떤 것을 위주로 할지 정하는 것입니다. DO 이하에는 직접 실행할 명령을 입력하는데요.

 

for %%i in (*.msu) do start /wait wusa %%i /quiet /norestart 

 

Vista 이상에서 Windows Update 설치시 사용할 수 있는 명령입니다. do 이하는 wusa의 명령을 시작하고 그 뒤는 msu 자체 내에서 허용하는 옵션입니다. 조용히 설치하고 재시작을 하지 않습니다.

 

/L

 

FOR /L %변수 IN (시작,단계,끝) DO 명령 [명령-매개 변수] 

 

역시 배치파일에서는 %%변수를 사용해야 하고 DO 이하는 같습니다.

 

set WIMFILE=install.wim

set MULTI=6

 

FOR /L %%j IN (5,1,%MULTI%) DO (
"%wimlib%" export "%ENCRYPTEDESD%" %%j ISOFOLDER\sources\%WIMFILE%

 

Windows ESD 파일의 내보내기 할 이미지의 수를 세기 위해 하는 것입니다.

 

ESD 파일의 이미지는 기본 4이고 %MULTI%에서 설정된 값에 따라 5에서 1씩 증가하여 install.wim을 내보내기 합니다. 만약 기본 이미지 포함하여 6개의 이미지가 있다면 5에서 1씩 증가시켜 6까지 두개 내보내기 하는 것입니다.

 

/F

 

FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ("문자열") DO 명령어 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ('명령어') DO 명령어 [명령-매개 변수] 

 

정말 많이 사용되는 명령입니다.

 

delims=

 

set _esd=0

 

for /f "delims=" %%i in ('dir /b "*.esd"') do (call set /a _esd+=1)

 

('명령어')


커맨드 명령어를 이용하여 문자를 알아내거나 명령을 실행하려면 ''를 사용해야 합니다.


여기서 delims는 구분 문자 입니다. 여기서는 공백인데 그 이유는 dir /b를 하고 텍스트 파일로 보내면 공백이 끝에 포함이 되기 때문에 공백을 구분 문자로 해 놓은 것입니다. 또한 delims가 없어도 구분 문자는 공백입니다.

 

현재 폴더에 esd 파일이 있는지 확인하고 DO 이하에서 set _esd를 호출하여(지금은 수식을 받으려고 하므로 set /a임) 1을 증가시킵니다.

 

tokens=

 

for /f "tokens=2 delims=: " %%i in ('bin\wimlib-imagex.exe info ESD 4 ^| findstr /b "Build"') do echo %%i 

 

구분 문자가 콜론과 공백입니다. ^|는 해당 명령 실행 후 나오는 화면에서 대소문자를 구별하지 않고 'Build'라는 문자열을 찾게 됩니다. for /f에 의하여 정의되면 9600이 출력됩니다. 실제 '명령어'를 실행하게 되면

 

Build             : 9600

 

로 나오게 되는데 이 때 콜론과 공백이 동시에 있고 얻어야 할 정보는 9600이니 Build를 토큰 1, 공백과 콜론을 제외하고 9600이 토큰 2이기 때문에 9600을 출력하게 됩니다.

 

for /f "tokens=1, 2, 3, 4, 5" %%i in ("1 2 3 4 5") do echo %%i.%%j.%%k.%%l.%%m 

 

토큰을 여러개 설정하고 %%i에서 시작 했다면 j, k, l, m을 뒤에 붙여 결과물이 여러개 나오게 할 수도 있습니다. 위 명령은 '1.2.3.4.5'가 나오게 됩니다.

 

 

skip=

 

 for /f "skip=4 tokens=2 delims=: " %%i in ('bin\wimlib-imagex.exe info ESD 4') do echo %%i

 

위와 같은 명령으로

 

Name            : Windows 8.1 Enterprise K Evaluation

DisplayName   : Windows 8.1 Enterprise K 64비트 평가판

Architecture    : x64

Language       : ko-KR

Build             : 9600

 

얻어야 할 9600이 위에서 5번째 줄에 있기 때문에 위에서 4번째 줄은 무시하고 5번째 줄부터 시작합니다. 그렇다면 findstr 명령은 쓰지 않아도 됩니다.

 

 

기타 명령어

 

자주 쓰일수도 있고 가끔 볼 수 있는 명령입니다.

 

GOTO

 

:를 사용하여 다음 문단으로 넘어가는 명령입니다.

 

set abc=1

 

IF %abc% EQU 1 goto :GGG

 

:GGG

exit

 

더 이상 실행될 명령이 없는 경우에 goto :eof로 마감 해주면 됩니다.

 

 

PAUSE

 

PAUSE는 말 그대로 일시 정지입니다. 이 명령을 하게 되면 자체적으로 '계속하려면 아무 키나 누르십시오...'라는 문장이 나오게 됩니다. 물론 한국어판에서 그렇게 보이는 것이고 각 언어판에 따라 다르게 보입니다. 하지만 이것과 같이 쓰이는 'pause >nul'도 있습니다. 이러한 명령을 넣어주면 저 문장이 나오지 않습니다.

 

외부 명령으로 입력시 자체 프로그램 내에서의 문구가 나타날 수 있습니다. 그것을 방지하기 위해서도 ' >nul'을 사용합니다.

 

 

EXIT /B

 

콜론과 각 문단의 이름으로 지정된 배치 문단으로 넘어가는 것을 방지하기 위함으로 사용합니다.

 

EXIT와는 다르게 프로그램을 종료하는 것이 아니기 때문에 여러 명령이 들어가 있고 순서없이 막 왔다갔다 하는 명령들은 이것을 넣어줘야 합니다.

 

if exist callisto.txt goto :callisto

 

:callisto

echo   Callisto

echo   Jupiter

echo   Callisto

echo   Jupiter

exit /b

pause

exit

 

:jupiter

echo   Jupiter

echo   Callisto

 

callisto.txt라는 파일이 있을 경우에 :callisto로 간다음에 에코를 출력합니다. 저는 :callisto 부분만 실행을 원하기 때문에 마지막에 exit /b를 넣었습니다. 만약 안했다면 :jupiter 부분도 실행이 됩니다.

 

 

CALL

 

명령을 불러오는 경우에 많이 사용됩니다.

 

set ESDENCRYPTED=1 :1은 해독, 2는 암호화

 

:ISO

if %ESDENCRYPTED%==1 call :decrypt

echo   Making ISO...

 

:decrypt

echo   ESD decrypted.

 

같은 배치파일 내에 있는 문단을 호출할 때도 사용되지만,

 

set ESDENCRYPTED=1 :1은 해독, 2는 암호화

 

:ISO

if %ESDENCRYPTED%==1 call decrypt.cmd

echo   Making ISO...

 

같은 폴더에 있는 다른 배치파일을 호출할 때도 사용됩니다.

 

 

CLS

 

말그대로 ClearScreen입니다. 이때까지 나타낸 출력물들을 지우는 것입니다.

 

echo   Callisto

pause

echo   Jupiter 

 

먼저 Callisto라는 에코를 출력한 다음에 pause 명령으로 아무 키나 누르면 Callisto 출력물은 없어지고 Jupiter 출력물이 나오게 됩니다.

 

 

:, REM

 

배치파일 주석입니다. 설명이 필요한 부분에 :이나 REM을 달아서 주석처리 해주면 됩니다.

 

 

솔직히 재미도 없고 이해가 안가는 부분이 많을 수도 있습니다. 전문이 아니라 그런지 제가 배운 내용으로는 한계가 있네요. 나름 이해 된다면 모르겠지만.. 아무튼 긴 내용을 쓰고나니 시원하네요.

반응형
  Comments,     Trackbacks