반응형
DOSBatch

DOS Batch

윈도우 커맨드에서 실행하는 DOS 스크립트 작성 방법. 쉽지만 막상 필요한 것을 하고 싶을 때 쉽지만은 않다. 자료가 많이 부족하다.

주석

  • 주석 명령은 설명문으로 실행되지 않는다.
  • rem 으로 실행하고 뒤에 주석문(아무 스트링)을 입력하면 된다. 주석은 프로그래밍시에 간략한 설명을 위한 것이다.
  • @rem test message… : 앞에 @를 붙이면 배치파일 실행시 rem 커맨드 출력이 안되도록 한다. 물론 그 전에 @echo off을 해 두었다면 @을 붙일 필요없다.
  • 더 간단하게는 :: 으로 시작하면 주석이 된다. 이것은 커맨드 출력도 되지 않아 더 간편히 사용할 수 있다. rem과 다르게 아예 없는 것으로 취급된다.

변수와 출력

  • dos batch는 파일 확장자를 .bat 또는 .cmd로 하여 메모장으로 텍스트 파일로 작성하면 된다.
  • 기본 적인 출력은 “echo” 커맨드가 있다. 뒤에 출력할 내용을 적으면 된다.
  • 출력 내용에 변수명을 적어 변수값을 출력할 수 도 있다. 또한 변수중에는 미리 시스템에서 정의된 값들도 있어서 유용하다.
  • 변수 설정은 set으로 변수이름과 값을 =으로 할당한다.
  • 변수 사용시에는 변수 이름 앞뒤로 %를 붙인다. 변수 삭제는 빈 값을 할당한다. (빈 값이 있는 변수로 만드는 것이 아니라 변수 자체를 삭제한다는 의미!)

SET FOO=hello world
echo %FOO%
echo %FOO%xxx%FOO%
SET FOO=

  • for문의 변수 이름은 커맨드창에서 바로 실행할 때 영문자앞에 %를 붙인다. 그러나, Dos batch file(.bat)에서 for문의 변수 영문자 앞에 %% 이렇게 %를 두 개 붙인다!
c:\> copy con test1.bat
@echo off
@rem this is a test batch...
set aaa=hello
echo %aaa%
echo %1
^Z
c:\> test1 kim
hello
kim
  • @echo off는 이후에 echo 실행명령은 출력하지 않고, 결과만 출력하도록 한다.

  • batch 파일 실행시 뒤에 파라미터를 줄 수 있는데, 순서대로 %1, %2, … 이렇게 변수로 사용할 수 있다.

  • 줄바꿈. 엔터 입력. 빈 줄 출력

echo.

  • 공백으로 시작하는 문자열 출력

echo. aaa
echo aaa (이것도 이제는 가능함. 앞에 공백 두 개)

  • 특수 문자 출력시 앞에 ^를 사용

echo ^< 이것은 꺾은 괄호 ^>
echo ^| 파이프
echo ^^ 두 개 입력시 하나 출력

스트링 처리

  • 문자열 추출 mid / substr

FOO 변수의 값에서 인덱스 6부터 3글자를 추출. (인덱스는 0부터 시작) 뒤에 수를 생략하면 끝까지를 의미함. -1은 마지막 바로 한글자를 의미.
set BAR=%FOO:~6,3%
set BAR=%FOO:~5%
set BAR=%FOO:~-3% : FOO가 파일명일떄 마지막 세글자(확장자명)을 가져온다.

연산

  • 수 값을 할당하거나 연산하려면 SET /a를 사용한다.

set /a num=4*8+8/2+122
set /a num=1
set /a num+=2
if %num% GEQ 3 echo big

환경 변수

%CD% : 현재 작업 디렉터리
%DATE% : date 커맨드와 같은 포맷의 날짜
%TIME%
%RANDOM% : 0~32767 범위의 수
%ERRORLEVEL%
%CMDCMDLINE%

파라미터

  • 파라미터는 %1, %2, 등으로 받는다. (%0은 배치파일 이름 자체임. %9까지 가능)
  • %*은 모든 파라미터를 의미함.
  • 파리미터 내부에 공백이 있으면 커맨드상에서 파라미터를 "로 둘러싼다. 단, 스크립트에서 "를 제거하고 받으려면 %~1, %~2 로 받는다.
  • 파라미터가 없으면 종료

if “%1” == “” goto :eof
파라미터에 "를 추가해 주어야 한다.’

Redirect

  • stderr까지 파일로 기록

cmd /c “test.exe” > “output.txt” 2>&1

  • 실행만 하고 출력은 없앰 (no output)

dir > nul
nul 이라는 파일은 생성되지 않는다. (NUL 대소문자 상관없음. 주의! L이 한 개임.)

type nul > a
0바이트짜리 a라는 파일 생성

program 2>output.txt
stderr 출력을 파일로 기록

배치내에서 배치 실행하기

call b.bat param1 param2

  • 동시 실행

start /d “directory…” /b program.exe
start /d “directory…” /b program.exe

디렉터리 경로명 이동

cd /d e:\temp

반복문 for

  • integer 증가

for /L %%n in (1,1,100) do net user %%n /add
1부터 100까지 증가하고, 숫자로 계정명으로 사용자를 추가한다.
(for의 변수는 커맨드로 실행시에는 %하나 batch file인 경우는 %% 두개를 사용한다.)

  • 1부터 5까지 출력

for /L %n in (1,1,5) do echo %n

  • 1부터 5까지 출력. 2씩 건너뜀.

for /L %n in (1,2,5) do echo %n
1,3,5 각각 한 줄로 출력됨.

goto

  • 종료시

goto :eof 또는 goto:eof
eof 레이블은 만들필요없이 미리정의된 거라 그대로 사용 가능
또는 exit /b 0

  • 레이블 지정과 goto

레이블 지정시에는 앞에 :을 붙이고 goto 시에는 :를 빼야 한다.
:loop
echo infinite…
goto loop

Sleep

@rem 3sec sleep
@ping 1.2.3.4 -n 1 -w 3000 > NUL

IF

  • 조건 판단
  • 같은지 확인 == 앞 뒤에 공백은 없어도 됨.

if %var% == 1 goto done
echo a
:done
echo b

  • if else : 괄호, 공백 주의

if %var% == 0 (
echo a
) else (
echo b
)

  • /i 옵션 : 대소문자 구분 없이 비교. (case-insensitive)

사용자 입력/텍스트파일변수

  • yn 선택지 (or 스트링 입력)

set /p result=message (Y/N)?
echo %result%
빈 값을 검사하려면 아래 코드를 참고

@echo off
:: init var for empty string.
set "result="
set /p result=are you ok(y/n)?
if "%result%" == "" (
echo no input
goto :eof
)
if /i "%result%"=="y" goto YES
if /i "%result%"=="n" goto NO

echo your input is %result%

  • 텍스트 파일을 첫 행을 읽어 변수에 할당

set /p var=<%temp%\filename.txt

> copy con lines.txt
hello1
hello2
hello3
^Z
> set /p var=<lines.txt
> echo %var% %var%
hello1 hello1

디렉터리

  • 중간 디렉터리까지 모두 생성. mkdir 대신 md를 사용

md “a\b\c”

  • 하위 파일/디렉터리 모두 삭제. /s 옵션

rmdir /s “dirname”

기타

  • 종료 : exit

exit /b 0 : /b는 cmd창은 남겨둔다는 의미. 뒤의 숫자는 프로그램 종료 리턴값. (다른 배치에서는 이 값을 errorlevel 변수로 받아 사용할 수 있다.)

  • 파일 병합 / 붙이기 concate
  • 파일 세 개를 붙여서 하나의 파일로 만든다.

copy 1.txt + 2.txt + 3.txt out.new /b

  • 배치 파일에서 다른 배치 파일 실행하기

call b.bat : call을 사용한다. 그냥 b.bat로 실행하면? b.bat가 종료시 나머지 스크립트로 돌아오지 않고 종료된다.

Author: crazyj7@gmail.com
Written with StackEdit.

'Develop > Windows' 카테고리의 다른 글

커맨드(cmd)창 관리자권한 실행  (1) 2019.10.23
Windows10 IP Change command line  (0) 2019.10.23
curl 사용법/HTTP 테스트  (0) 2019.10.01
화면/윈도우 동영상 녹화 (mp4, gif)  (0) 2019.09.23
windows 10 kernel structure  (0) 2015.08.28

+ Recent posts