Skip to main content

[공유] Bat 파일 명령어 모음

Related image

도스창 : 윈도우화면>시작버튼>명령어입력 부분에서 cmd.exe를 실행  --> 까만색의 화면이 뜬다.
나는 이 화면을 편의상 도스창이라고 부르겠다.  이 도스창과 과거 DOS OS와는 상관이 없다. 단지 모양이 비슷할 뿐이다.

Batch file과 Shell Script는 같은 용어이다.
단,
Batch file : Microsoft에서 부르는 용어.
Shell Script : Linux에서 부르는 용어.

아래의 모든 설명은 MS를 기준으로 설명한다.
배치파일은 텍스트 파일로써, Shell 프로그램에서 실행되는 명령어들과 조건문들의 내용을 담고 있다.
쉘프로그램이 배치파일을 실행시키면, 한줄 한줄씩 배치파일의 내용이 실행이된다.
배치파일의 종류는 확장자가 .bat 파일    :  cmd.exe 또는 command.com으로 실행시킬 수 있다.
                          확장자가 .vbs 파일   :  cscript.exe 또는 wscript.exe로 실행시킬 수 있다.
                          확장자가 .js  파일     :  cscript.exe 또는 wscript.exe로 실행시킬 수 있다.
                          확장자가 .ps1 파일   :  powershell.exe로 실행시킬 수 있다. 
     
bat 파일보다는, vbs 또는 js 파일에서 좀 더 많은 기능을 구현할 수 있으며,
가장 최근에 나온 파워쉘은 가장 많은 기능을 구현할 수 있다.

Shell 프로그램들에는, cmd.exe, wscript.exe, cscript.exe, command.com 등의 파일이 있다.
이 프로그램들은 윈도우화면>시작버튼>명령어입력 부분에서 실행시키면 된다. 
         (단 cscript.exe는, 먼저 cmd.exe를 실행시킨 후의 도스창에서 실행시키면 된다.)
cmd.exe : 32비트로 동작하는 프로그램이다.  확장자가 .bat인 파일을 실행시킬 수 있다.
cscript.exe  : wscript.exe와 동일하지만, 도스창에서 실행이 된다.
wscript.exe  : cscript.exe와 동일하지만, 윈도우에서 실행이 된다.
command.com : 16비트로 동작하는 프로그램이다. 윈도우 OS에서 실행시키면, 도스 에뮬레이션상에서 동작이 된다.
                        이 프로그램은 사용하지 않는 것을 추천한다.


<환경변수에 대하여>
윈도우 OS는 부팅을 하면, 자체적으로 설정된 환경변수들을 가지고 있다.
cmd.exe를 실행시켜 도스창을 열면, 이 도스창은 윈도우OS의 자체 환경변수들을 물려 받는다.
도스창에서 >set 이라고 치면, 윈도우OS로 부터 물려받은 환경변수들을 확인할 수가 있다.
도스창에서 >set A=B 라는 식으로 환경변수들을 추가로 설정할 수가 있는데,
이 추가된 환경변수들이 영향을 미치는 곳은, 현재 이 도스창 뿐이다.
따라서 이 도스창을 종료하면 추가된 환경변수는 undefined 상태가 된다.
도스창에서 배치파일을 실행시키면, 이 배치파일내에서 정의된 환경변수들은, 배치파일이 끝나도 현재의 도스창에서 계속 유효하다.
배치파일내에서, 일부 영역에서만 특정 환경변수들의 정의를 유효화 시키고 싶다면,
   setlocal
      배치파일 내용
   endlocal
이런 식으로 하면 된다.
그러면 setlocal과 endlocal 사이에서 정의된 환경변수들은, 그 안에서만 유효하다.


아래의 설명은 가장 간단한 배치파일인 .bat 파일에 대해서 설명한다.
명령어 갯수가 많지 않아서 그나마 가장 배우기 쉽지만,
이 명령어들과 조건문들을 어떻게 결합하느냐에 따라서 대단히 다양하고 복잡한 기능들을 구현할 수 있다.
< .BAT 파일의 문법과 예제 >
배치파일에서는, 우리가 도스창에서 즐겨 사용하는 copy, del, dir, cd, format, fdisk 등등 이외에도
다음의 명령어들과 문법들을 사용할 수가 있다.

ECHO : 배치파일의 내용은 한 줄씩 실행이된다.
             또한 배치파일이 실행이 될 때, 무조건 echo가 on 상태에서 배치파일의 처음 부분이 실행이 된다. 
             echo on 상태 : 한 줄이 실행될 때 마다, 그 줄의 내용을 화면에 뿌려준다.
             echo off 상태 : 줄이 실행될 때, 그 줄의 내용을 화면에 뿌리지 않는다.
                                   단, 줄의 실행된 내용이 출력이 있는 경우에는 당연히 출력을 화면에 뿌려준다.
      echo on : 이 라인 다음의 라인부터 echo-on 상태가 된다.
      echo off : 이 라인 다음의 라인부터 echo-off 상태가 된다.
      echo 문장 : 문장을 화면에 출력한다.
      echo. :  empty line을 출력한다.
      echo %undefined1%  : 만일 undefined1이라는 변수가 정의되어 있지 않은 상태라면,
                                           화면에 ECHO가 정의되어 있지 않습니다. 라는 메시지가 출력이 된다.


@ : 이것이 붙어 있는 라인은, echo-off 상태에서 그 라인이 실행이 된다.
      즉 그 줄의 내용 자체는 화면에 표시가 안되고, 실행된 출력만이 화면에 표시가 된다.

:LABEL  : 라벨을 표시한다. GOTO와 함께 사용이 되어, 특정 래이블로 제어를 점프하기 위해 사용한다.

%숫자  : 도스창의 프롬프트에서 배치파일을 실행시킬 때의 인자들을, 배치파일내에서 사용하기 위함이다.
               첫번째 인자를 %0, 두번째 인자를 %1, ....이런식으로 받아들인다. 따라서 %0~%9 까지 받아들인다. 
               여기서 %0는 파일이름을 받는다.

SHIFT : 도스창의 프롬프트에서 배치파일을 실행시킬 때의 인자들은, %0~%9 까지 받아들인다고 설명을 했다.
             그런데 이 shift 명령을 한 번 실행시키면, 명령어 인자들이 전체적으로 하나씩 쉬프트되어서,
             %0=(파일이름을 제외한)첫번째 인자, %1=두번째 인자...이런식으로 된다.
             따라서 인자들이 9개 이상이 되어도, shift 명령을 통해서, 프로그램내에서 모두 사용할 수가 있다.
      shift /n  : 여기서 n은 0~8.  n-1번째 까지는 그대로 두고, n = n+1, n+1 = n+2... 이런식이다.
                      즉, n-1번째 까지는 그대로 두고, n번째 인자가 사라지고, n+1과 그 이후가 한 칸씩 왼쪽으로 쉬프트된다.

      모든 인자를 사용하는 더 간단한 방법 :
            FOR %%A IN (%*) DO ( .... Now your batch file handles %%A instead of %1 ....)  : 단, 이 때 %*는 %1부터 시작한다.
           
조건실행 : 
        & :    command1 &  command2  : command1의 실행이 끝나고, command2를 실행한다.
        && :  command1 && command2  : command1의 실행이 성공적으로 끝나는 경우에만, command2를 실행한다.
        || :   command1 || command2  : command1의 실행이 실패로 끝나는 경우에만, command2를 실행한다.

CALL : 배치파일내에서 다른 배치파일을 호출하기 위함이다.

        SET : 현재 설정되어 있는 모든 환경변수들과 그 값들을 보여준다.
        SET variable :  현재 설정되어 있는 variable의 값을 보여준다.   화면에 variable=설정값 형태로 출력이 된다. 
                                 만일 variable이 설정되어 있지 않다면, "variable가 설정되어있지 않다"라는 메시지를 보여준다.
        SET variable=string  :  variable의 값을 string으로 설정한다.
              예) SET var1=%var2%    :  var2가 undefined 상태라고 하자. 그러면 var1도 undefined상태가 된다.
                    SET var3=     :  var3는 undefined 상태가 된다.
        SET /A variable=numerical expression : string위치에 오는 것은 문자열이 아니라, 수식이다.   
                  수식의 우선순위는 다음과 같다. (위쪽일 수록 높은 우선순위)
                  ()                 grouping
                  * / %            arithmetic operators
                  + -                arithmetic operators
                  << >>           logical shift
                  &                  bitwise and
                  ^                  bitwise exclusive or
                  |                  bitwise or
                   = *= /= %= += -=              assignment
                   &= ^= |= <<= >>=
                   ,                                   expression separator

        SET /P variable=[promptString] : 사용자가 값을 입력할것을 요구를 하고, 입력된 값은 variable로 들어간다.
              예) SET /P tempvar1=[원하는 수식을 입력하세요:]    : 사용자가 3+4엔터 를 입력했다고 하자.                    SET /A tempvar2=%tempvar1%                         : 3+4가 계산이 되어 tempvar2에 입력이 된다.
                    Echo 계산된 값은
IF[NOT] ERRORLEVEL number command
IF[NOT] string1==string2 command
IF[NOT] EXIST filename command
NOTSpecifies that Windows should carry out the command only if the condition is FALSE
ERRORLEVEL  number  
Specifies a TRUE condition
if the last program run returned an exit code equal to or greater than the number specified.
string1==string2Specifies a TRUE condition if the specified text strings match.
EXIST filenameSpecifies a TRUE condition if the specified filename exists.
commandSpecifies the command to carry out if the condition is met.
command can be followed by ELSE command2 which will execute command2 if the specified condition is FALSE
       EQU -equal          (or   string1 == string2 )  
       NEQ-not equal
       LSS-less than
       LEQ-less than or equal
       GTR-greater than
       GEQ-greater than or equal
DEL[/P] [/F] [/S] [/Q] [/A[[:]attributes]] [[drive:][path]filename
ERASE[/P] [/F] [/S] [/Q] [/A[[:]attributes]] [[drive:][path]filename
[[drive:][path]filename    Specifies the file(s) to delete.  Specify multiple files by using wildcards.
/PPrompts for confirmation before deleting each file.
/FForce deleting of read-only files.
/SDelete specified files from all subdirectories.
/QQuiet mode, do not ask if ok to delete on global wildcard
/ASelects files to delete based on attributes
attributes   AFiles ready for archiving
HHidden files
RRead-only files
SSystem files
-Prefix meaning not
XCOPY

source [destination] [/A | /M] [/C] [/D[:date]] [/F] [/H] [/I] [/K] [/L] [/N] [/P] [/Q] [/R] [/S [/E]] [/T] [/U] [/V] [/W] [/Z] [/EXCLUDE:filename]
source
destination
/A
/C
/D[:m-d-y]
/E
/F
/H
/I
/K
/L
/M
/N
/P
/Q
/R
/S
/T
/U
/V
/W
/Z
/EXCLUDE:filename
x
                    SET tempvar2                                                : 7이 출력이 된다. (주의! tempvar2 다음에 바로 줄바꿈이 와야 한다.)


IF 문 : 

IF [/I] string1 compare-op string2 command                ( /I 를 붙이면  case-insensitive 문자열 비교가 된다.) 
where compare-op may be one of :

IF DEFINED variable command    : variable이 정의가 되어 있다면, command를 실행한다.


EXIT : exit를 실행시키면, cmd.exe까지 모두 종료시켜버린다.
           만일 배치파일만 종료를 시키고 싶다면, Exit /B를 하면 된다.
  
Comments 처리 : 배치파일내에, 코드가 아닌, 단순한 설명문을 넣고자 할 때 다음과 같은 여러가지 방법이 있다.
         아래와 같은 방법으로 사용하면 된다.
         REM comments   
         :unused_label comments    :  사용하지 않는 label을 지정하고, 그 뒤에 설명을 달면 된다.    
         :: comments                        :  사용하지 않는 label로써, :를 사용한 것 뿐이다.
         (위의 3가지 방법들은 모두, leading spaces를 허용한다. 그 외의 것은 위의 문장들 앞에 올 수가 없다.)
         그런데  :unused_label ::는 조심을 해야 할 점이 있다. 그것은 For문의 command블록 또는  IF문의 command블록안에서
         이 것들을 사용하게 되면 에러가 발생을 하기 때문이다.
         이럴때는 이 것들을 아예 For문 또는 IF문 밖으로 빼 내거나  또는  REM문을 사용하면 된다.



DEL : 지정한 파일들을 삭제한다.
del 다음에 파일이름이 아니고, 디렉토리이름만 지정해 주면, 그 디렉토리안의 모든 파일들을 삭제시킨다.


Redirection : 프로그램은 기본적으로 stdin(0)은 키보드, stdout(1)은 화면, stderr(2)은 화면으로 설정이 된다.
                      stdout과 stderr의 차이는, stdout은 버퍼를 거쳐서 화면에 뿌려진다.
                      따라서 버퍼가 다 차기 전까지는 화면에 뿌려지지 않는다.
                      반면에 stderr은 버퍼를 사용하지 않기 때문에, 출력할 데이터는 바로 바로 화면에 뿌려진다.
                      이렇게 기본적으로 설정된 것들을 사용하지 않고, 다르게 사용하고 싶을때 재지향 기호 > 를 사용한다.
              command1  >  filename  :  command1의 stdout출력을 화면이 아니라,  filename으로 보낸다.
                                                         command1의 stderr은 기존처럼 화면에 뿌려진다.
              command1  <  filename  :  command1의 입력을 키보드로부터 받는것이 아니라, filename으로 부터 받는다.
              command1  <  infile > outfile : 키보드가 아니라 infile로 부터 입력을 받고, stdout을 화면이 아니라 outfile로 출력을 한다.
                                                                command1의 stderr은 기존처럼 화면에 뿌려진다. 
              command1 2> file  :  command1의 stdout은 화면으로, stderr은 file로 보낸다.
              command1 > file 2>&1     :    command1의 stdout은 file로, stderr은 stdout으로 보낸다.
                                                          즉 stdout과 stderr모두 file로 보낸다.
                       이 문장을 간단하게 표기하는 또 다른 방법은 command1 &>file  command1 >&file이다.
              command1 >nul : command1의 stdout출력을, 화면에 뿌리는 것이 아니라, 그냥 버린다.

        파이프 :   command1 | command2     : command1의 stdout출력을 command2의 입력으로 보낸다. 
                      이것은  command1 > tempfile,   command2 < tempfile, del tempfile 과 동일하다.
                      command1, command2의 stderr은 기존처럼 화면에 뿌려진다.
              command1   2>& | command2   :    command1의 stdout과 stderr을 모두, command2의 stdin으로 보낸다.


RMDIR [/S] [/Q] [drive:]path
RD       [/S] [/Q] [drive:]path
    /S      Removes all directories and files in the specified directory in addition to the directory itself. 
             Used to remove a directory tree.
    /Q      Quiet mode, do not ask if ok to remove a directory tree with /S



EXIT : exit를 실행시키면, cmd.exe까지 모두 종료시켜버린다.
           만일 배치파일만 종료를 시키고 싶다면, Exit /B를 하면 된다.





XCOPY : 
Specifies the file(s) to copy.
Specifies the location and/or name of new files.
Copies files with the archive attribute set, doesn't change the attribute.
Continues copying even if errors occur.
Copies files changed on or after the specified date.
If no date is given, copies only those files whose source time is newer than the destination time.
Copies directories and subdirectories, including empty ones.
Same as /S /E. May be used to modify /T.
Displays full source and destination file names while copying.
Copies hidden and system files also.
If destination does not exist and copying more than one file, assumes that destination must be a directory.
Copies attributes. Normal Xcopy will reset read-only attributes.
Displays files that would be copied (list only).
Copies files with the archive attribute set, turns off the archive attribute.
Copies using the generated short names.
Prompts you before creating each destination file.
Does not display file names while copying.
Overwrites read-only files.
Copies directories and subdirectories except empty ones.
Creates directory structure, but does not copy files.
Does not include empty directories or subdirectories.
/T /E includes empty directories and subdirectories.
Copies only files that already exist in destination.
Verifies each new file.
Prompts you to press a key before copying.
Copies networked files in restartable mode.
Excludes the files listed in the specified file from the copy operation. The exclusion file can have a list of exclusion patterns (one per line, no wild card characters are supported). If any exclusion pattern in the file matches any part of the path of a subject file, that file is not copied.



Comments

Popular posts from this blog

ftp, sftp, ssh 차이점

telnet ==> ssh  ftp ==> sftp  p2p방식이라 보안에 취약한것이 아니라 telnet과 ftp 인 경우는 패킷을 캡쳐해서 보면, 평문이기 때문에 보여져서는 안될부분(패스워드, 계정 등)이 쉽게 노출된다. 이는 아주 큰 문제를 발생시킬 수 있다. 이런 취약점을 보안하기 위해서 telnet은 ssh로  f tp는 sftp로 암호화된 프로토콜 SSL을 사용하는게 좋다. 이렇게 하면 모든 패킷을 암호화 해서 주고 받으므로  패킷을 잡아내더라도 해독하는데 슈퍼컴퓨터로 1달 이상 걸리게 된다.  cf)  telnet 과 ftp의 차이 telnet: 쉘권한을 취득(ex. bash)하여 마치 로컬 컴퓨터를 다루는 것처럼  실행되는 접속 방법  ftp: 파일을 전송하기 위한 프로토콜.  telnet으로 파일 전송을 못하며(zmodem프로토콜을 사용하면 되지만, 엄청 느림) ftp로 시스템을 관리하거나 데몬을 띄우는 것은 불가능.  Reference https://wpengine.com/resources/how-to-access-wordpress-files-using-sftp/ https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=linuxserver&wr_id=19987

우분투 18.04 react-native run-android 실행 시 javax.net.ssl.SSLException 에러

리엑트 네이티브를 시작했다. ( 참고 ) 기본 튜토리얼 에서  create-react-native-app 를 사용하는 예제는 쉽게 실행됐는데 바로 요놈! react-native-cli 를 써서  react- native init [프로젝트 이름]  로 실행하는 예제는 뭐가 문제인지 실행한번 하는데 엄청나게 애를 먹였다. 우선 리액트 공식 홈페이지에서 하라는데로 다 했다는 전제하에 참고하시면 된다. 나름 다 잘 따라했다고 생각했는데 문제는 자바(jdk)였다. JAVA_HOME 환경변수 설정이 안되어 있었다. 일단 초기에 echo $JAVA_HOME 이라고 쳤는데 아무 것도 안뜨면 환경변수 설정이 아예 안돼있는 것이다. 순서 대로 체크리스트를 만들어보자면, 1. jdk버전을 확인하자 Java Development Kit React Native requires a recent version of the Java SE Development Kit (JDK).  Download and install JDK 8 or newer  if needed. cd /usr/lib/jvm/ 를 하면 현재 설치된 jdk들을 확인 할 수 있다. jdk8 이상의 버전이 없다면 아래 명령어로 다운 받자 sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer 2. JAVA_HOME 환경 변수를 등록하기 위해 cd ~ 를 하여 홈으로 이동하고 숨김 파일인 .bashrc를 수정하자. 튜토리얼에는  $HOME/.bash_profile 이라고 되어 있지만 18.04에서는 저 파일이 없어서 알아보니 bashrc를 수정하면 된다. 나는 vim을 쓰므로 vim .bashrc 라고 입력했다. nano나 다른 편집기를 사용해도 좋다. 그리고 아래 명령어를 .bas

Anaconda tensorflow-gpu 설치 에러 [WinError 126] 지정된 모듈을 찾을 수 없습니다, importError: Could not find 'cudnn64_6.dll'

anaconda를 이용하여 tensorflow cpu 버전을 사용하다가 training이 끝나지를 않아서  gpu 버전을 써보기로 했다. cpu 버전은 나름 쉽게 설치했었는데 gpu는 조금 더 까다로웠다. 블로그들을 참고해보니 막 무슨 파일을 다운 받고 어디에 붙여넣고 하라는데  처음에는 이해가 잘 안됐다. 내가 이해한대로 해보자면, 우선 다른 블로그를 참고해서 아나콘다와 tensorflow cpu 버전 설치 직전까지 진행해주시고, 필요한 파일은  CUDA 8.0 CuDNN 6.0 두 파일을 순서대로 설치. 대충 내용을 보니 CUDA 8.0은 그냥 설치하는 파일이고 CuDNN는 설치한 cuda 폴더 안에 추가하는 라이브러리, 기타등등 파일인데 다른 블로그에서는 CuDNN 폴더를 다 붙여 넣으라고도 했지만 딱 봐도 확연히 안에 들어있는 파일이 달라서 CuDNN 폴더에 있는 파일을 기존 cuda 폴더 안에 붙여 넣어주었다. 아무튼 여기서 주의해야 될 점은 CuDNN이 6.0이라는 것이다. 다른 블로그에서는 5.1을 받으라고 되어있는데 이상하게 내 anaconda에서는 계속 cudnn64_6.dll 파일을 찾을 수 없다고 에러가 떴다. 바로 이 에러이다. 알아보니 5.1은 bin 폴더안에 cudnn64_5.dll를 가지고 있고 6.0이 cudnn64_6.dll을 갖고 있었다. cudnn64_6.dll을 기본 설치 폴더 기준 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin 안에 붙여넣으니 성공적으로 tensorflow-gpu를 이용할 수 있게 되었다.