<In Story>

BAT(CMD) 매개 변수 사용 및 시스템 및 로컬 환경 변수 // [OS] [MS Windows] [Command] [Script] 본문

OS(operating system)/MS WIndows

BAT(CMD) 매개 변수 사용 및 시스템 및 로컬 환경 변수 // [OS] [MS Windows] [Command] [Script]

<In Story, Hi story, History> 2015. 6. 7. 14:31

https://msdn.microsoft.com/ko-kr/library/cc755880(v=ws.10).aspx


배치 매개 변수 사용

배치 매개 변수는 배치 파일의 모든 위치에서 사용하여 환경 설정 정보를 추출할 수 있습니다.

Cmd.exe는 배치 매개 변수 확장 변수를 %0에서 %9까지 제공합니다. 배치 파일에서 배치 매개 변수를 사용하면 %0은 배치 파일 이름으로 바뀌고 %1에서 %9는 명령줄에 입력한 해당 인수로 바뀝니다. %9 이외의 인수에 액세스하려면 shift 명령을 사용해야 합니다. shift 명령에 대한 자세한 내용은 Shift를 참조하십시오. %* 배치 매개 변수는 배치 파일로 전달되는 %0을 제외하고 모든 인수에 대해 와일드카드를 참조합니다.

shift설명
  • 명령 확장과 함께 shift 명령줄 옵션 사용 기본 설정인 명령 확장을 사용하면 shift 명령은 N번째 인수부터 이동을 시작하는 /n 명령줄 옵션을 지원합니다. 여기서 N은 0에서 8 사이의 값입니다. 예를 들어, SHIFT /2는 %2를 %3으로, %3를 %4으로 %4를 %5 변경하되 %0과 %1은 이동하지 않습니다

  • shift 명령의 수행 원리 shift 명령은 각 매개 변수를 이전의 매개 변수에 복사하는 방식으로 %0부터 %9까지 배치 매개 변수 값을 변경합니다. 즉, %1의 값은 %0에 복사되고 %2의 값은 %1에 복사되는 방식으로 계속 진행됩니다. 이 방식은 임의 개수의 매개 변수에 같은 작업을 수행하는 배치 파일을 작성할 때 유용합니다. 

  • 11개 이상의 배치 매개 변수 사용 shift 명령을 사용하여 11개 이상의 배치 매개 변수를 사용하는 배치 파일을 만들 수 있습니다. 명령줄에서 11개 이상의 매개 변수를 지정하면 10번째(%9) 다음에 오는 매개 변수는 하나씩 %9로 변경됩니다. 

  • %*와 shift의 사용 shift는 %* 배치 매개 변수에 영향을 주지 않습니다.

  • 매개 변수를 원래대로 이동 되돌리는 shift 명령은 없습니다. shift 명령을 실행한 후에는 이동 전의 첫째 배치 매개 변수(%0)를 복구할 수 없습니다. 


예를 들어 Folder1에서 Folder2로 내용을 복사하려면 %1은 Folder1 값으로 바뀌고 %2는 Folder2 값으로 바뀌므로 Mybatch.bat라는 배치 파일에서 다음과 같이 입력합니다.

xcopy %1\*.* %2

파일을 실행하려면 다음과 같이 입력합니다.

mybatch.bat C:\folder1 D:\folder2

이렇게 하면 배치 파일에서 다음과 같이 입력하는 것과 같은 결과를 가져옵니다.

xcopy C:\folder1 \*.* D:\folder2

배치 매개 변수와 수정자를 함께 사용할 수도 있습니다. 수정자는 현재 드라이브 및 디렉터리 정보를 사용하여 배치 매개 변수를 파일의 일부 또는 전체나 디렉터리 이름으로 확장합니다. 한정자를 사용하려면 퍼센트(%) 문자와 물결(~) 문자를 차례로 입력한 다음 해당 한정자를 입력합니다(예: %~modifier).

다음 표는 확장에 사용할 수 있는 수정자를 보여 줍니다.

 

한정자설명

%~1

%1을 확장하고 모든 따옴표("")를 삭제합니다.

%~f1

%1을 완전한 경로 이름으로 확장합니다.

%~d1

%1을 드라이브 문자로 확장합니다.

%~p1

%1을 경로로 확장합니다.

%~n1

%1을 파일 이름으로 확장합니다.

%~x1

%1을 파일 확장명으로 확장합니다.

%~s1

확장 경로는 짧은 이름만 포함합니다.

%~a1

%1을 파일 속성으로 확장합니다.

%~t1

%1을 파일의 날짜 및 시간으로 확장합니다.

%~z1

%1을 파일 크기로 확장합니다.

%~$PATH:1

PATH 환경 변수에 있는 경로를 검색하고 %1이 처음 발견한 완전한 경로 이름으로 확장합니다. 환경 변수 이름이 정의되어 있지 않거나 파일을 찾을 수 없으면 이 수정자는 빈 문자열로 확장됩니다.

다음 표는 함께 사용할 수 있는 수정자와 한정자를 보여 줍니다. 수정자와 한정자를 함께 사용하면 복합적인 결과를 얻을 수 있습니다.

 

한정자

설명

%~dp1

%1을 드라이브 문자와 경로로 확장합니다.

%~nx1

%1을 파일 이름과 확장명으로 확장합니다.

%~dp$PATH:1

PATH 환경 변수 목록에 있는 디렉터리에서 %1을 검색하여 처음 발견한 드라이브 문자와 경로로 확장합니다.

%~ftza1

%1을 dir 형식의 출력 줄로 확장합니다.

참고

  • 위의 예제에서 %1 및 PATH를 다른 배치 매개 변수 값으로 바꿀 수 있습니다. 

%* 수정자는 배치 파일에서 사용되는 모든 인수를 나타내는 고유한 수정자입니다. 이 수정자는 %~ 수정자와 함께 사용할 수 없습니다. %~ 구문은 유효한 인수 값으로 끝나야 합니다.

환경 변수를 변경하는 방법으로 배치 매개 변수를 변경할 수 없습니다. 값을 검색하고 대체하거나 하위 문자열을 검사할 수 없습니다. 그러나 매개 변수를 환경 변수에 할당한 다음 환경 변수를 변경할 수 있습니다.


-------------------------------------------------------------------------------------------------------------------

http://tjwindows.blogspot.kr/2012/03/blog-post.html


모든 매개변수 넘기기:

%* 

예)
java -jar foo.jar %*

!) 만약 위 batch 파일을 path 에 등록하고 다른 위치에서도 사용하려고 한다면 위 foo.jar 파일의 경로는 절대 경로로 설정하는 편이 좋은 거 같다 
 - 기본 batch 파일을 실행하는 위치에서 foo.jar 파일을 찾게 되기 때문

옵션 매개변수:
예)
:loop
if not [%1] == [] (
    if [%1] == [--username] (
        set username=%2
        shift
    ) else if [%1] == [--password] (
        set password=%2
        shift
    )
    shift
    goto loop
)

echo Username=%username%
echo Password=%password%

매개변수 경로 얻기:
%0 %1 식으로 % 에 숫자를 줌으로써 매개 변수를 얻을 수 있다.
%0 은 실행하고 있는 해당 batch 파일이고 1 이상 부터는 입력된 매개 변수 순서대로 이다.

매개 변수의 드라이브명 경로명 등을 얻을 수 있다.

드라이드명:
%~d0

% 와 0 사이에 ~d 옵션이 붙었다.

0 번째 매개변수는 batch 파일 자신이기 때문에 해당 batch 파일이 c: 에 있다면 c: 가 출력된다.

경로명:
%~p0

만약 해당 batch 파일이 c:\batch\test\ 경로에 있다면 \batch\test\ 가 출력된다.

드라이브 + 경로명:
%~dp0

만약 해당 batch 파일이 c:\batch\test\ 경로에 있다면 c:\batch\tet\ 가 출력된다.


-------------------------------------------------------------------------------------------------------------------

http://snoopybox.co.kr/1404


PUSHD %~DP0


이것 역시 제가 배치파일 초반에 항상 적어주는데요, 그 이유는 윈도우 7 때문입니다. 윈도우 7에선 특이하게도 UAC가 켜져있는 환경에서 배치파일을 관리자 권한으로 실행하는 경우 명령 프롬프트 위치가 C:\Windows\System32 기준으로 실행됩니다. 이게 왜 문제가 되냐하면 보통은 배치파일과 함께 같은 위치에 첨부 파일을 두고 다른 곳으로 복사해주는 명령어를 쓰거나 아니면 그 첨부파일을 실행하는 경우가 많은데, 이렇게 명령 프롬프트 위치가 변경되어 버리면 복사할 파일이나 실행할 파일의 절대경로를 적어야 합니다. 그런데 배치파일은 어느 위치에서 실행될지 아무도 모르죠. 따라서 복사할 파일의 절대경로도 그때그때 달라지게 됩니다. 물론 각 파일 경로 앞에 %~DP0를 일일이 붙여주면 되지만 그건 너무 귀찮은 일입니다. 따라서 이렇게 명령 프롬프트 위치를 배치파일이 있는 디렉터리로 되돌려주는게 훨씬 편합니다.

그런데 %~DP0의 의미가 궁금하실 것 같습니다. 이게 바로 FOR 구문의 대체 변수 참조 확장입니다. 자세한 내용은 FOR /? 입력해서 확인해보시구요, 저는 간단히 예제를 통해 설명드리겠습니다.

배치파일에서 %0는 그 배치파일의 전체 경로를 지칭합니다. %0 사이에 들어있는 ~dp는 %변수를 드라이브 문자와 경로로만 확장해줍니다. 예를 들어 제 컴퓨터 바탕화면에 예제.cmd 파일이 있는 경우

%0

“C:\Users\snoopy\Desktop\예제.cmd”

%~0

C:\Users\snoopy\Desktop\예제.cmd

%~d0

C:

%~p0

\Users\snoopy\Desktop\

%~n0

예제

%~x0

.cmd

%~dp0

C:\Users\snoopy\Desktop\


따라서 pushd %~dp0 라고 적으면 명령 프롬프트가 배치파일이 존재하는 위치로 돌아오게 됩니다. 이제 응용력이 뛰어나신 분들은 이런 생각을 하실 것 같습니다. "그렇다면 %~dpnx0 와 %~0 는 같은 값을 나타내겠군!" 네 그렇습니다. %~ 확장은 이처럼 한꺼번에 섞어서 사용해도 됩니다.

※ 참고로 PUSHD %~DP0 대신에 CD /D %~DP0 해도 상관은 없습니다.

-------------------------------------------------------------------------------------------------------------------


https://msdn.microsoft.com/ko-kr/library/cc737438(v=ws.10).aspx


다음 목록은 다양한 유형의 변수를 내림차순으로 설명합니다.

  1. 기본 제공 시스템 변수

  2. HKEY_LOCAL_MACHINE 하이브에 있는 시스템 변수

  3. HKEY_CURRENT_USER 하이브에 있는 로컬 변수

  4. 모든 환경 변수 및 Autoexec.bat 파일에서 설정된 경로

  5. 모든 환경 변수 및 로그온 스크립트에서 설정된 경로

  6. 스크립트 또는 배치 파일과 상호 작용하는 변수

기본적으로 명령 셸에서 각 Cmd.exe 인스턴스는 부모 응용 프로그램의 환경을 상속 받습니다. 그러므로 새로운 Cmd.exe 환경에서 부모 응용 프로그램의 환경을 변화시키지 않고 변수를 변경할 수 있습니다.

다음 표는 Windows 서버 운영 체제의 시스템 및 로컬 환경 변수를 보여 줍니다.

 

변수종류설명

%ALLUSERSPROFILE%

현지 시간

모든 사용자 프로필의 위치를 반환합니다.

%APPDATA%

현지 시간

응용 프로그램이 기본적으로 데이터를 저장하는 위치를 반환합니다.

%CD%

현지 시간

현재 디렉터리 문자열을 반환합니다.

%CMDCMDLINE%

현지 시간

현재 Cmd.exe를 시작하는 데 사용되는 정확한 명령줄을 반환합니다.

%CMDEXTVERSION%

시스템

현재 명령 프로세서 확장의 버전 번호를 반환합니다.

%COMPUTERNAME%

시스템

컴퓨터의 이름을 반환합니다.

%COMSPEC%

시스템

실행할 수 있는 명령 셸의 정확한 경로를 반환합니다.

%DATE%

시스템

현재 날짜를 반환합니다. date /t 명령과 같은 형식을 사용합니다. Cmd.exe에 의해 생성됩니다. date 명령에 대한 자세한 내용은Date를 참조하십시오.

%ERRORLEVEL%

시스템

최근에 사용된 명령의 오류 코드를 반환합니다. 대개 0이 아닌 값은 오류를 나타냅니다.

%HOMEDRIVE%

시스템

사용자 홈 디렉터리에 연결된 로컬 워크스테이션 드라이브 문자를 반환합니다. 홈 디렉터리의 값을 기반으로 설정합니다. 사용자 홈 디렉터리는 로컬 사용자 및 그룹에서 지정됩니다.

%HOMEPATH%

시스템

사용자 홈 디렉터리의 전체 경로를 반환합니다. 홈 디렉터리의 값을 기반으로 설정합니다. 사용자 홈 디렉터리는 로컬 사용자 및 그룹에서 지정됩니다.

%HOMESHARE%

시스템

사용자 공유 홈 디렉터리의 네트워크 경로를 반환합니다. 홈 디렉터리의 값을 기반으로 설정합니다. 사용자 홈 디렉터리는 로컬 사용자 및 그룹에서 지정됩니다.

%LOGONSERVER%

현지 시간

현재 로그온 세션을 확인한 도메인 컨트롤러의 이름을 반환합니다.

%NUMBER_OF_PROCESSORS%

시스템

컴퓨터에 설치된 프로세서의 수를 지정합니다.

%OS%

시스템

운영 체제 이름을 반환합니다. Windows 2000은 운영 체제를 Windows NT로 표시합니다.

%PATH%

시스템

실행 파일의 검색 경로를 지정합니다.

%PATHEXT%

시스템

운영 체제에서 실행 가능하다고 간주되는 파일 확장명 목록을 반환합니다.

%PROCESSOR_ARCHITECTURE%

시스템

프로세서의 칩 아키텍처를 반환합니다. 값: x86 또는 IA64(Itanium 기반)

%PROCESSOR_IDENTFIER%

시스템

프로세서의 설명을 반환합니다.

%PROCESSOR_LEVEL%

시스템

컴퓨터에 설치된 프로세서의 모델 수를 반환합니다.

%PROCESSOR_REVISION%

시스템

프로세서의 수정 버전 번호를 반환합니다.

%PROMPT%

현지 시간

현재 인터프리터에 대한 명령 프롬프트 설정을 반환합니다. Cmd.exe에 의해 생성됩니다.

%RANDOM%

시스템

0에서 32767까지의 수 중에서 임의의 십진수를 반환합니다. Cmd.exe에 의해 생성됩니다.

%SYSTEMDRIVE%

시스템

Windows Server 운영 체제 루트 디렉터리(시스템 루트)가 있는 드라이브를 반환합니다.

%SYSTEMROOT%

시스템

Windows Server 운영 체제 루트 디렉터리의 위치를 반환합니다.

%TEMP% 및 %TMP%

시스템 및 사용자

현재 로그온한 사용자가 사용할 수 있는 응용 프로그램이 사용하는 기본 임시 디렉터리를 반환합니다. 일부 응용 프로그램은 TEMP를 요구하고 다른 프로그램은 TMP를 요구합니다.

%TIME%

시스템

현재 시간을 반환합니다. time /t 명령과 같은 형식을 사용합니다. Cmd.exe에 의해 생성됩니다. time 명령에 대한 자세한 내용은Time을 참조하십시오.

%USERDOMAIN%

현지 시간

사용자 계정을 포함한 도메인 이름을 반환합니다.

%USERNAME%

현지 시간

현재 로그온되어 있는 사용자의 이름을 반환합니다.

%USERPROFILE%

현지 시간

현재 사용자에 대한 프로필 위치를 반환합니다.

%WINDIR%

시스템

운영 체제 디렉터리의 위치를 반환합니다.

환경 변수 설정

set 명령을 사용하여 환경 변수를 만들고 변경하고 삭제하거나 표시합니다. set 명령은 현재 셸 환경에서만 변수를 변경합니다.