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 |