batch 파일에 대해 알아보자
리눅스 배포판을 사용하다보면 bash shell을 사용하게 되는데 쉘스크립트를 이용하여 파일의 입출력을 할당하거나 파일의 내용을 불러오는 등의 다양한 기능을 구현할 수 있다.
윈도우즈 10부터 bash shell에 대한 지원이 시작되긴하였지만 여전히 많은 개발자들이 윈도우 환경에서 비슷한 기능을 하는 DOS batch file을 이용하고 있다. 이제 그만 shell로 했으면 좋겠다.
쉘스크립트가 그러하듯이 batch파일 역시 사용자와 운영체제를 이어주는 역할이라고 이해하면 될듯하다.
비슷한 구성이며 또 공부한다고 손해볼것도 없으니 간략히 한번 알아본다.
First Batch File "hello.bat"
DOS batch 파일은 .bat .cmd 확장자를 사용한다.
바탕화면에 hello.bat 파일을 만들고 다음과 같이 입력한 다음 저장 후 더블클릭하여 실행시켜보자.
batch 파일은 마우스 오른쪽으로 클릭 후 편집을 눌러서 편집모드로 전환할 수 있다.
@echo hello world
@pause
실행시킨 배치파일과 독립적인 새창을 열어 결과를 출력한다.커맨드 프로세서는 배치파일에 나열된 명령들을 한줄씩 실행하므로 특정 커맨드에 의해 출력을 하거나 사용자의 입력을 기다리도록 제어할 수 있다.
첫째줄의 @echo는 쉘스크립트와 동일하게 뒤에 따라오는 문자열을 출력하는 기능이다.
두 번째 줄의 @pause 명령은 사용자가 키보드를 누를 때까지 명령프로세서가 일시 중지된다.
'@' 기호는 명령 프로세서가 실행하는 동안 화면에서 라인을 출력시키는 것을 방지한다.
무슨 의미일까?
다음 코드와 같이 '@'를 없앤다음 실행시켜본다.
echo Hello world.
pause
ECHO OFF/ON
위 결과는 명령어를 한번씩 더 보여준다. 이는 불필요한 작업이다.
@echo off를 커맨드 라인에 배치할 경우 각 라인에 '@'기호를 삽입하는 불편함을 피할 수 있다.
@가 붙어 있는 라인은 ECHO OFF상태에서 실행결과만 출력한다.
즉, @ECHO OFF는 다음에 나오는 명령어를 에코하지 않도록 한다.
@echo off
echo hello world.
pause
명령어가 보이길 원할경우 @echo off가 아닌 @echo on으로 설정한다.
특정 명령어에 대한 사용법이 궁금할때는 커맨드 창에 help와 해당 명령어를 타이핑 할 경우 설명이 나온다.
C:\Windows\System32>help echo
Displays messages, or turns command-echoing on or off.
ECHO [ON | OFF]
ECHO [message]
Type ECHO without parameters to display the current echo setting.
C:\Windows\System32>echo
ECHO is on.
ECHO.
문자열의 라인을 바꾸고 싶을때는 echo 뒤에 .(dot)을 붙여서 echo.을 입력하면 공백을 추가하여 문자열 줄바꿈이 실행된다.
@echo off
echo O say can you see by the dawn's early light
ECHO.
ECHO.
echo.what so proudly we haled at the twilight's last gleaming
pause
ECHO.은 대문자로 기입해야 동작한다.
SET 변수입력
SET은 변수를 지정하는 명령어다. 변수에는 문자나 숫자 상관없이 입력할 수 있다.
@echo off
SET questglobal=12345
pause
SETX
유저 또는 시스템 환경에서 윈도우 환경변수를 생성 또는 수정한다.
인수, 레지스트리 키 또는 파일입력을 기준으로 변수를 설정할 수 있다.
%variable% 변수출력
변수입력 커맨드의 questglobal을 출력하기 위해 echo와 함께 변수 양쪽에 %를 붙이면 된다.
@echo off
SET questglobal=12345
echo %questglobal%
pause
GOTO, :LABEL
C언어의 goto와 마찬가지로 특정 라벨로 분기한다.
라벨은 :LABEL과 같은 형태로 명시되어야 한다.
@echo off
goto QUEST
ECHO hello
:QUEST
ECHO quest
pause
start
start는 실행파일을 실행하는 명령어다. 디렉토리에 mytext라는 text파일을 만들고
start mytext로 진행할 경우 mytext.txt파일이 열린다.
rem
주석처리를 할때 사용한다.
@echo off
echo 1
rem echo 2
echo 3
pause
c언어의 //과 같은 기능이다.
mkdir/rmdir
make directory와 remove directory 명령어다. 이름 그대로 디렉토리(폴더)를 만들거나 삭제하는 커맨드다.
리눅스와 비슷하게 사용된다.
@echo off
mkdir quest
mkdir global
rmdir global
pause
위 커맨드를 실행할 경우 quest와 global이라는 두 개의 디렉토리를 만들고 4번째 줄의 rmdir 커맨드에 의해 global 디렉토리를 삭제하므로 최종적으로 quest디렉토리만 남게 된다.
del
del은 파일을 삭제한다.
디렉토리 하단에 위치한 test.txt 파일을 del 명령을 통해 삭제했다.
COPY
파일 복사
DIR
디렉토리 내의 하위항목들을 표시한다.
( * )와일드 카드
와일드 카드란 무엇인가? 와일드 카드는 문자로 *로 표시한다. 이용은 간단하다.
원하는 파일이나 디렉토리를 검색하거나 지정하거나 찾을때 사용된다.
아래 그림과 같이 현재 디렉토리에 temp.txt, test.txt, time.txt 세 개의 텍스트파일이 있을때 디렉토리 하위항목을 보여주는 dir 커맨드와 함께 t*.txt라고 타겟을 정할경우 맨 앞에 t로 시작하는 파일들만 출력된다. te*.txt라고 검색하면 time.txt를 제외한 te가 포함된 나머지 파일들이 검색된다.
%
매개변수의 앞에 붙는다.
/
명령어의 옵션 플래그를 나타낸다.
IF / IF NOT / ELSE / == / !==!
if 문은 다음과 같이 사용될 수 있다. 일반적인 프로그래밍과 같이 if 다음에 조건문이 나온다.
==와 !==!는 각각 같은지와 다른지를 비교하는 구문이다.
@echo off
set foo="1234"
if %foo%=="1234" echo equal
pause
if not은 뒤에 오는 조건이 아니면에 해당되는 구문이다.
c로 따지면 조건에 !(NOT)을 붙이는 것과 같다.
@echo off
set foo="5678"
if not %foo%=="1234" echo notequal
pause
위 내용을 보면 foo는 "5678"로 되어있기 때문에 foork "1234"가 아닌지 조건을 따진다면 참이 되는 것이므로 notequal을 출력한다.
else도 사용법이 단순하다.
@echo off
if exist abc.txt (
echo abc.txt
) else (
echo abc.txt missing.
)
pause
exist는 abc.txt가 경로에 있는지 체크한다. abc.txt 파일은 없으므로 else로 분기하여 abc.txt missing.을 출력한다.
SORT
입력된 문자열들을 오름차순으로 정렬한다.
입력이 끝났을때 Ctrl+Z를 눌러주면 정렬된 아우풋이 출력된다.
> 출력 리다이렉션
출력의 결과물을 파일에 입력으로 전달한다.
redirection은 단어의 뜻 그대로 direction을 다시 정하는 것이다. 방향을 다시 정하는 것으로 이해하자.
echo 명령의 경우 명령 다음에 입력된 내용을 화면에 출력하는 것이 기본인데 이 때의 출력을 화면이 아닌 파일로 변경하는 것을 리다이렉션이라 할 수 있다. 다이렉션이냐 디렉션이냐는 영국, 미국 발음 차이이니 알아서 잘 쓰면된다.
@echo off
Echo Hello World > test.txt
pause
>>
>의 경우 파일에 있는내용에 입력으로 쓰는 내용을 덮어쓰는 형태가 되지만 >>의 경우 원래의 기입된 내용에 이어 순차적으로 덧붙여서 내용을 갱신하게 된다.
@echo off
Echo Hello World > test.txt
echo locked and loaded >> test.txt
pause
< 입력 리다이렉션
파일의 내용을 리다이렉션을 통해 입력으로 받는다.
sort 명령의 입력으로 파일을 할당해서 결과를 확인해보자.
test.txt 파일의 내용이 위와 같을때 배치파일을 아래와 같이 sort의 입력으로 test.txt파일을 할당한다.
문자열이 알파벳 순서로 정렬되어 출력된 것을 확인할 수 있다.
| pipe
파이프는 특정 명령에 대한 출력이 다른 명령의 입력으로 할당할때 이를 연결하는 역할을 한다.
dir /b 명령을 입력할 경우 하위의 파일과 디렉토리 항목을 표출한다.
여기에 정렬을 역순으로 진행하는 sort /r을 함께 파이프 시키면 하위항목을 역순으로 출력한다.
FOR/IN/DO
for 커맨드에 대한 도움말을 검색할 경우.
파일 집합의 각 파일에 대해 지정된 명령 실행. 이라는 설명이 나타난다.
FOR의 기본 포맷은 다음과 같다.
FOR %variable IN (set) DO command [command-parameters]
%variable | 변경가능한 단일문자 매개변수를 지정. |
(set) | 하나 이상의 파일 집합을 지정. 와일드카드를 사용할 수 있다. |
command | 각 파일에 대해 수행할 명령을 지정 |
command-parameters | 지정된 명령에 대한 매개 변수 또는 스위치를 지정한다. |
배치 프로그램에서 FOR 명령 다음의 변수는 %variable 대신 %%variable으로 % 두 개를 사용하여 지정한다.
변수 이름은 대소문자를 구분하므로 %i는 %I와 다르다.
IN 다음에는 어떤 파일을 대상으로 지정할 것인지 나타낸다.
DO 이하는 IN에서 지정된 파일들에 대해 어떤 작업을 할것인지 명령어와 옵션을 나타낸다.
for 문의 예제를 한번 만들어 보겠다.
위 그림의 디렉토리와 같이 하위에 temp.txt, test.txt, time.txt이 있을때 이 항목들을 출력하는 명령문을 만들어 보겠다.
for %%i in (te*.txt) do echo "%%i"
i는 변수이고 in 뒤에 와야하는 파일의 집합의 형태는 괄호로 묶은다음 te*.txt라고 기입했다. 이건 te가 들어가있는 텍스트파일을 나타내므로 test.txt와 temp.txt가 해당된다. do 커맨드 뒤에 echo "%%i"는 각 텍스트파일을 출력하라는 명령이다.
time.txt를 제외한 temp, test가 출력되는것을 확인할 수 있다.
NUL
명령어 출력을 전부 빨아먹어서 없애버린다.
화면이 있는 명령어의 뒤에 > NUL을 붙여주면 화면에 출력이 되지 않는다.
@echo off
echo hello wolrd > nul
pause
위 코드는 hello world가 출력될 것으로 기대되지만 해당 출력은 nul로 인해 출력되지 않고 pause에 의해 일시정지되어
press any key to continue...만 출력된다.
CHOICE
choice는 명령어 뒤에 선택항목을 추가하여 어떤 항목을 선택할 것인지 나타내는 명령어다.
choice에 부가적으로 적용할 수 있는 옵션은 다음과 같다.
/C | choices | 만들 선택 항목 목록을 지정. 기본 목록은 "YN"이다. |
/N | 프롬프트에서 선택 목록을 숨긴다. 프롬프트 앞에 메시지가 표시되고 선택 항목이 계속 활성화다. |
|
/CS | 대소문자를 구분하는 선택 항목을 선택할 수 있다. 기본적으로 이 유틸리티는 대소문자를 구분하지 않는다. |
|
/T | timeout | 기본 선택을 수행하기 전에 일시 중지할 시간(초). 허용되는 값은 0 ~ 9999다. 0을 지정하면 일시 중지가 없고 기본 선택 항목이 선택된다. |
/D | choice | nnn초 후에 기본 선택 항목을 지정. 문자는 /C 옵션에서 지정한 선택 집합에 있어야 하며 /T로 nnn을 지정해야 한다. |
/M | test | 프롬프트 앞에 표시할 메시지를 지정. 지정하지 않으면 유틸리티 프롬프트만 표시. |
/? | help 메시지 출력 |
IF
배치파일의 조건에 따른 실행을 제어할 수 있다.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT | 조건이 잘못된 경우에만 명령을 수행하도록 지정 |
ERRORLEVEL number | 마지막 프로그램 실행에서 지정된 숫자 이상의 종료 코드를 반환한 경우 실제 조건을 지정 |
string1==string2 | 지정한 텍스트 문자열이 일치하는 경우 참 조건을 지정 |
EXIST filename | 지정된 파일 이름이 있는 경우 참 조건을 지정 |
command | 조건이 충족될 경우 수행할 커맨드를 지정. 지정된 조건이 FALSE인 경우 ELSE 키워드 뒤에 해당하는 명령을 넣을 수 있다. IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) 다음 커맨드는 else가 같은 라인에 있으므로 미동작. IF EXIST filename. del filename. ELSE echo filename. missing 아래 커맨드는 정상동작. IF EXIST filename. del filename. ELSE echo filename. missing 만약 한 라인에서 동작하도록 하려면 아래와 같이 괄호로 묶는다. IF EXIST filename. (del filename.) ELSE echo filename. missing |
IF에 대한 커맨드 확장(Extension)이 활성화되었을 경우 다음을 따른다.
- IF [/I] string1 compare-op string2 command
- IF CMDEXTVERSION number command
- IF DEFINED variable command
문자열과 문자열을 비교할때 비교 옵션을 사용할 수 있다.
비교옵션(compare-op)은 다음과 같다.
EQU - equal
NEQ - not equal
LSS - less than
LEQ - less than or equal
GTR - greater than
GEQ - greater than or equal
[ /I ] 스위치는 대/소문자를 구분하지 않는 문자열을 지정. /I 스위치는 IF의 string1==string2과 같은 형태로 사용가능. string1과 string2가 모두 숫자로 되어 있으면 문자열이 숫자로 변환되어 숫자비교를 수행하게 된다.
CMDEXTVERSION 조건부는 Command Extension과 연결된 내부 버전 번호와 비교한다는 점을 제외하고 ERRORLEVEL과 동일하게 작동한다. 첫 번째 버전은 1이며 Command Extension에 중요한 기능이 추가되면 이 값이 1씩 증가한다. Command Extension을 사용하지 않도록 설정하면 CMDEXTVERSION 조건이 적용되지 않는다.
DEFINED 조건부는 Command Extension(환경 변수) 이름을 사용하고 환경 변수가 정의된 경우 true를 반환한다는 점을 제외하고는 EXIST와 동일하게 작동.
%ERRORLEVEL%는 ERRORLEVEL 이름을 가진 환경 변수가 아직 없는 경우 ERRORLEVEL의 현재 값을 문자열로 나타낸다. 이렇게 표현하면 무슨 말인지 잘 이해가 안가는데 EORRORELVEL은 직전 실행프로그램의 값을 가지고 있으므로 IF문 안에서의 ERRORLEVEL은 다른 배치파일이나 프로그램의 호출 이후 에러값을 확인해서 처리하는 경우에 사용할 수 있다.
하위 항목을 표출하는 DIR 커맨드 실행 후 ECHO %errolevel%을 실행하면 값이 0으로 출력된다.
D:\Study\Windows Bat>DIR
Volume in drive D is New Volume
Volume Serial Number is 44E5-E7D8
Directory of D:\Study\Windows Bat
2023-06-22 오전 11:31 <DIR> .
2023-06-14 오전 10:02 <DIR> ..
2023-06-22 오전 11:36 121 hello.bat
2023-06-20 오후 02:02 0 temp.txt
2023-06-20 오후 01:41 27 test.txt
2023-06-20 오후 01:41 27 test1.txt
2023-06-22 오전 11:32 28 time.bat
2023-06-20 오후 01:58 <DIR> zzz
5 File(s) 203 bytes
3 Dir(s) 209,281,380,352 bytes free
D:\Study\Windows Bat>echo %ERRORLEVEL%
0
하지만 틀린 명령을 일부러 실행시켜보면 errorlevel이 바뀐것을 확인할 수 있다.
D:\Study\Windows Bat>ehco hello
'ehco' is not recognized as an internal or external command,
operable program or batch file.
D:\Study\Windows Bat>echo %errorlevel%
9009
앞서 errorlevel이 0이 아닐때 아래와 같이
D:\Study\Windows Bat>IF %errorlevel NEQ 0 ECHO error
error
응용할 수 있다.
CALL
다른 스크립트 배치파일을 포함.
현재 디렉토리에 time.bat 파일이 함께 있고 time.bat 파일의 내용은
@echo off
echo timetimetime
같을때
hello.bat에서 time.bat 호출은 다음과 같이 할 수 있다.
@echo off
call time.bat
pause
TITLE
콘솔 창의 이름을 변경하는 명령어다.
@echo off
title hello world
pause
CON
표준입력을 나타낸다. 응용은 아래의 MODE 예제에 포함되어 있다.
PRN
프린터 디바이스.
COM1
첫번째 시리얼 포트
TYPE
파일 또는 텍스트파일의 콘텐츠를 화며에 표출한다.
TYPE [drive:][path] filename
파일 내용을 표출.
FIND
문자 찾기.
@echo off
type "D:\Study\Windows Bat\test.txt" | find "Hello"
pause
FINDSTR
문자열 찾기 명령이다. FIND와 비슷하지만 용도에 따라 뒤에 붙는 옵션에 따라 기능이 달라진다.
Searches for a text string in a file or files.
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V Displays all lines NOT containing the specified string.
/C Displays only the count of lines containing the string.
/N Displays line numbers with the displayed lines.
/I Ignores the case of characters when searching for the string.
/OFF[LINE] Do not skip files with offline attribute set.
"string" Specifies the text string to find.
[drive:][path]filename
Specifies a file or files to search.
If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.
D:\Study\Windows Bat>help findstr
Searches for strings in files.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
strings [[drive:][path]filename[ ...]]
/B Matches pattern if at the beginning of a line.
/E Matches pattern if at the end of a line.
/L Uses search strings literally.
/R Uses search strings as regular expressions.
/S Searches for matching files in the current directory and all
subdirectories.
/I Specifies that the search is not to be case-sensitive.
/X Prints lines that match exactly.
/V Prints only lines that do not contain a match.
/N Prints the line number before each line that matches.
/M Prints only the filename if a file contains a match.
/O Prints character offset before each matching line.
/P Skip files with non-printable characters.
/OFF[LINE] Do not skip files with offline attribute set.
/A:attr Specifies color attribute with two hex digits. See "color /?"
/F:file Reads file list from the specified file(/ stands for console).
/C:string Uses specified string as a literal search string.
/G:file Gets search strings from the specified file(/ stands for console).
/D:dir Search a semicolon delimited list of directories
strings Text to be searched for.
[drive:][path]filename
Specifies a file or files to search.
@echo off
type "D:\Study\Windows Bat\test.txt" | findstr -l "Hello"
pause
우와 같이 실행할 경우 직전의 find 커맨드 예제와 동일한 결과를 볼 수 있다.
MODE
아래 이미지 처럼 여러가지 기능이 있지만 간단하게 통상 창의 크기를 바꾸는 기능으로 활용하는듯 하다.
여기서 콘솔창의 크기가 갑자기 바뀌는게 아니라 창안에서의 문자의 표현범위가 바뀌는 것으로 이해하는게 빠를것 같다.
예를 들어 아래와 같이 열과 행을 각각 5로 설정하였다.
출력이 어떻게 나오는지 관찰하기 위해 뒤에 문자열이 출력하도록 하였다.
@echo off
MODE CON COLS=5 LINES=5
echo 123456789abcdefghijklmnopqrsw
pause
출력결과는 행과 열의 크기를 5로 설정했기 때문에 5*5까지만 표출하고 더이상 표출하지 않는다.
COLOR
콘솔창의 폰트와 배 색을 설정한다..
COLOR [attr]
attr Specifies color attribute of console output
색상 속성은 두 개의 16진수로 지정. 첫 번째 숫자는 배경에 해당하고 두 번째 숫자는 폰트에 해당.
0 = Black 8 = Gray
1 = Blue 9 = Light Blue
2 = Green A = Light Green
3 = Aqua B = Light Aqua
4 = Red C = Light Red
5 = Purple D = Light Purple
6 = Yellow E = Light Yellow
7 = White F = Bright White
매개인수가 지정되지 않으면 이 명령은 색상을 CMD.EXE가 시작될 때의 상태로 복원한다. 이 값은 현재 콘솔 창, /T 명령줄 스위치 또는 DefaultColor 레지스트리 값에서 가져온다.
COLOR 명령은 폰트와 배경색이 동일한 COLOR 명령을 실행하려고 하면 ERROR LEVEL을 1로 설정한다.
기본색이 폰트는 흰색 배경은 검정색인데 이를 반전시키기 위해 폰트는 검정색 배경은 흰색으로 설정하는 구문을 작성해본다.
@echo off
color 70
pause
배경색을 흰색으로 했는데 완전 흰새은 아니고 밝은 회색에 가깝다.
PAUSE
이미 앞의 예시코드에서 사용하고 있었다. 배치파일이 진행되지 않고 일시정지 하도록 하는 명령어다.
일시정지를 끝내고 계속 진행하려면 Ctrl+C를 누르면 된다. Ctrl+C를 누르면 배치파일을 끝낸것인지 물어보는 문구가 나타난다.
xcpoy
하위 디렉토리를 포함하여 파일 및 디렉터리를 복사한다.
xcopy 명령어는 매개변수가 정해져 있으며 아래와 같은 옵션을 사용할 수 있다.
Xcopy <Source> [<Destination>] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g]
[/d [:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t]
[/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x]
[/exclude:FileName1[+[FileName2]][+[FileName3]]]
[{/y | /-y}] [/z] [/b] [/j] [/compress]
매개 변수
매개변수 | 설명 |
<원본> | 필수 요소. 복사 하려는 파일의 이름과 위치를 지정 한다. 이 매개 변수는 드라이브 또는 경로 포함 해야 한다. |
[<대상>] | 복사 하려는 파일의 destination을 지정. 이 매개 변수는 드라이브 문자 및 콜론, 디렉터리 이름, 파일 이름, 또는 이들의 조합을 포함할 수 있다. |
/w | 다음 메시지를 표시하고 파일 복사를 시작하기 전에 응답을 기다린다. Press any key to start copying files . |
/p | 각 destination 파일을 생성할지 여부를 확인하는 메시지가 나타난다. |
/C | 오류를 무시한다. |
/v | target 파일은 source 파일에 있는지 확인할 수 있도록 target 파일에 기록 될 때 각 파일을 확인 한다. |
/q | xcopy 메시지 표시하지 않는다. |
/f | 복사 하는 동안 source 및 destination 파일 이름을 표시한다. |
/l | 복사할 파일 목록을 생성하지만 파일을 적극적으로 복사하지는 않는다. |
/g | target에서 암호화를 지원하지 않는 경우 암호화된 target file을 만든다. |
/d [: MM 될] | 변경되었거나 지정된 날짜 이후에 있는 파일만 복사한다. MM-DD-YYY 값을 포함하지 않으면 에서는 기존 대상 파일보다 최신의 모든 원본 파일을 복사한다. 이 명령줄 옵션을 사용하여 변경된 파일을 업데이트할 수 있다. |
/U | source에 있는 파일만 destination으로 복사한다. |
/i | source가 디렉터리이거나 와일드카드가 포함되어 있고 target이 없는 경우 target은 디렉터리 이름을 지정하고 새 디렉터리를 만든다고 가정한다. 그런 다음 지정된 모든 파일을 새 디렉터리에 복사한다. 기본적으로 xcopy대상을 파일인지 디렉터리인지 지정하라는 메시지가 표시된다. |
/s | 비어 있지 않은 경우 디렉터리 및 하위 디렉터리에 복사 한다. /s를 생략하는 경우 xcopy가 단일 디렉터리 내에서 작동한다. |
/e | 모든 하위 디렉터리가 비어 있더라도 복사한다. /e 및 /s 및 /t 명령줄 옵션을 사용한다. |
/t | 하위 디렉터리 구조(트리)만 복사하고 파일은 복사하지 않는다. 빈 디렉토리를 복사하려면 /e 명령줄 옵션을 포함해야 한다. |
/k | source 파일에 있는 경우 파일을 복사하고 destination 파일에 읽기 전용 특성을 유지한다. 기본적으로 읽기 전용 특성이 제거된다. |
/r | 읽기 전용 파일을 복사 한다. |
/h | 숨김 및 시스템 파일 특성이 파일에 복사된다. 기본적으로 숨김 파일이나 시스템 파일은 복사하지 않는다. |
/a | 아카이브 특성이 설정된 원본 파일만 복사한다. /a 원본 파일의 아카이브 파일 특성을 수정하지 않는다. |
/m | 아카이브 특성이 설정된 원본 파일을 복사한다. /a와 달리 /m은 소스에 지정된 파일의 아카이브 특성을 해제한다. |
/n | NTFS 짧은 파일 또는 디렉터리 이름을 사용 하 여 복사본을 만든다. /n 은 NTFS 볼륨에서 FAT 볼륨으로 파일 또는 디렉터리를 복사하거나 대상 파일 시스템에서 FAT 파일 시스템 명명 규칙(즉, 8.3자)이 필요한 경우에 필요하다. destinatio* 파일 시스템은 FAT 또는 NTFS일 수 있다. |
/o | 소유권 및 DACL(임의 액세스 제어 목록) 정보 파일을 복사다. |
/x | 파일 감사 설정 및 시스템 액세스 제어 목록(SACL) 정보를 복사한다(/o 의미). |
/exclude:FileName1[+[FileName2]][+[FileName3]( )] | 파일의 목록을 지정한다. 하나 이상의 파일에 지정 되어야 한다. 각 파일의 파일에서 별도 줄에 각 문자열 검색 문자열이 포함 된다. 문자열이 복사할 파일의 절대 경로 부분과 일치하면 해당 파일은 복사되지 않는다. 예를 들어 string obj 를 지정하면 디렉터리 obj 아래의 모든 파일 또는 .obj 확장명인 모든 파일이 제외된다. |
/y | 기존 대상 파일을 덮어쓸 것인지를 확인 하는 메시지를 표시 하지 않는다. |
/ y | 기존 대상 파일을 덮어쓸 것인지를 확인 하 라는 메시지를 표시 한다. |
/z | 다시 시작 가능 모드에서 네트워크를 통해 복사 한다. |
/b | 파일 대신 바로 가기 링크를 복사한다. 이 매개 변수는 Windows Vista®에서 도입 되었다. |
/j | 버퍼링 하지 않고 파일을 복사 한다. 매우 큰 파일에 적용하는 것이 좋다. 이 매개 변수는 Windows Server 2008 R2에 추가되었다. |
/압축 | 해당하는 경우 파일 전송 중에 네트워크 압축을 요청한다. |
/? | 명령 프롬프트에 도움말을 표시한다. |
예제
1. 드라이브 A에서 드라이브 B로 모든 파일 및 하위 디렉터리(빈 하위 디렉터리 포함)를 복사하려면 다음과 같이 입력한다.
xcopy a: b: /s /e
2. 이전 예제에 시스템 또는 숨겨진 파일을 포함하려면 다음과 같이 /h 명령줄 옵션을 추가한다.
xcopy a: b: /s /e /h
3. \Reports 디렉터리의 파일을 1993년 12월 29일 이후 변경된 \Rawdata 디렉터리의 파일로 업데이트하려면 다음을 입력한다.
xcopy \rawdata \reports /d:12-29-1993
4. 이전 예제의 \Reports에 있는 모든 파일을 날짜와 관계없이 업데이트하려면 다음을 입력한다.
xcopy \rawdata \reports /u
5. 이전 명령에서 복사할 파일 목록을 가져오려면(즉, 실제로 파일을 복사하지 않고) 다음을 입력한다.
xcopy \rawdata \reports /d:12-29-1993 /l > xcopy.out
파일 xcopy.out를 복사하는 모든 파일을 나열한다.
6. \Customer 디렉터리와 모든 하위 디렉터리를 네트워크 드라이브 H:의 \\Public\Address 디렉터리에 복사하려면 읽기 전용 특성을 유지하고 H:에 새 파일을 만들 때 메시지가 표시되도록 하려면 다음을 입력한다.
xcopy \customer h:\public\address /s /e /k /p
7. 이전 명령을 xcopy 실행하려면 \Address 디렉터리가 없는 경우 를 만들고 새 디렉터리를 만들 때 표시되는 메시지를 표시하지 않도록 하려면 다음과 같이 /i 명령줄 옵션을 추가한다.
xcopy \customer h:\public\address /s /e /k /p /i
8. 작업을 수행하는 xcopy 일괄 처리 프로그램을 만들고, 오류가 발생하는 경우 명령을 사용하여 종료 코드를 처리할 경우 일괄 처리를 사용할 수 있다. 예를 들어 다음 일괄 처리 프로그램은 원본 및 대상 매개 변수에 대체 가능한 매개 변수를 xcopy 사용한다.
@echo off
rem COPYIT.BAT transfers all files in all subdirectories of
rem the source drive or directory (%1) to the destination
rem drive or directory (%2)
xcopy %1 %2 /s /e
if errorlevel 4 goto lowmemory
if errorlevel 2 goto abort
if errorlevel 0 goto exit
:lowmemory
echo Insufficient memory to copy files or
echo invalid drive or command-line syntax.
goto exit
:abort
echo You pressed CTRL+C to end the copy operation.
goto exit
:exit
이전 일괄 처리 프로그램을 사용하여 C:\Prgmcode 디렉터리와 해당 하위 디렉터리의 모든 파일을 복사하여 B를 구동하려면 다음을 입력한다.
copyit c:\prgmcode b:
명령 인터프리터는 C:\Prgmcode를 %1 및 B로 대체한다. %2의 경우 /e 및 /s 명령줄 옵션과 함께 사용한다. 오류가 발생하면 일괄 처리 프로그램은 종료 코드를 읽고 적절한 IF ERRORLEVEL 문에 표시된 레이블로 이동하고 적절한 메시지를 표시하고 일괄 처리 프로그램에서 종료한다.
9. 이 예제에서는 비어 있지 않은 모든 디렉터리를 복사하고 별표 기호 다음에 연결된 파일 확장자를 가진 파일을 복사한다.
xcopy .\toc*.yml ..\..\Copy-To\ /S /Y
rem Output example.
rem .\d1\toc.yml
rem .\d1\d12\toc.yml
rem .\d2\toc.yml
rem 3 File(s) copied
앞의 예제에서 이 특정 소스 매개 변수 값 .\toc*.yml 은 두 개의 경로 문자 .\ 가 제거된 경우에도 동일한 3개의 파일을 복사한다. 그러나 소스 매개 변수에서 별표 와일드카드를 제거하면 파일이 복사되지 않으므로 .\toc.yml만 된다.
Batch File vs Shell Script
배치 파일 연산자쉘 스크립트 동의어뜻
% | $ | 명령어줄 매개변수 접두사 |
/ | - | 명령어 옵션 플래그 |
/ | 디렉토리 패스 구분자 | |
== | = | (같음) 문자열 비교 테스트 |
!==! | != | (다름) 문자열 비교 테스트 |
| | | | 파이프 |
@ | set +v | 현재 명령어를 에코하지 말 것 |
* | * | 파일명 "와일드 카드" |
> | > | 파일 재지향(덮어 쓰기) |
>> | >> | 파일 재지향(덧붙여 쓰기) |
< | < | 표준입력 재지향 |
%VAR% | $VAR | 환경 변수 |
REM | # | 주석 |
NOT | ! | 뒤에 나오는 테스트 부정 |
NUL | /dev/null | 명령어 출력을 없애기 위한 "블랙홀" |
ECHO | echo | 에코 (Bash 에는 옵션이 많이 있음) |
ECHO. | echo | 빈 줄 에코 |
ECHO OFF | set +v | 다음에 나오는 명령어를 에코하지 말 것 |
FOR %%VAR IN (LIST) DO | for var in [list]; do | "for" 루프 |
:LABEL | 없음 (필요치 않음) | 라벨 |
GOTO | 없음 (대신 함수를 씀) | 스크립트의 다른 곳으로 건너 뜀 |
PAUSE | sleep | 일정 간격을 두고 잠시 대기 |
CHOICE | case 나 select | 메뉴 선택 |
IF | if | if-test |
IF EXIST FILENAME | if [ -e filename ] | 파일이 존재하는지 확인 |
IF !%N==! | if [ -z "$N" ] | 변경가능한 매개변수인 "N"이 없다면 |
CALL | source 나 . (도트 연산자) | 다른 스크립트를 "포함" |
COMMAND /C | source 나 . (도트 연산자) | 다른 스크립트를 "포함"(CALL과 동일) |
SET | export | 환경 변수를 세트 |
SHIFT | shift | 명령어줄 변수 목록을 왼쪽으로 이동(shift) |
SGN | -lt or -gt | (정수) 부호(sign) |
ERRORLEVEL | $? | 종료 상태 |
CON | stdin | "콘솔"(표준입력) |
PRN | /dev/lp0 | (일반적인) 프린터 디바이스 |
LP1 | /dev/lp0 | 첫번째 프린터 디바이스 |
COM1 | /dev/ttyS0 | 첫번째 시리얼 포트 |
Windows 명령
https://learn.microsoft.com/ko-kr/windows-server/administration/windows-commands/windows-commands