메모

dos batch set p 옵션...펌

맘편한넘 2012. 7. 23. 18:06
10
배치 스크립트에서 변수를 확인하거나, 만드는 등의 관리를 하는 명령어인 Set에 대해 알아보자.

우선 Win + R을 눌러 실행 창을 열고 cmd라고 입력해보자.

set을 입력해보면 현재 시스템에 설정되어 있는 환경변수들을 모두 출력해준다.

그리고 set path를 입력하면 환경변수 PATH의 내용을 출력해준다.

또 이번엔 set p라고 입력시키면 변수 이름이 P로 시작되는 모든 변수가 출력해준다.

그런데 만약 해당 변수 이름이 없다면 어떻게 될까?

바로 ERRORLEVEL이라는 상태 변수를 1로 설정하게 되는데, 이 것도 후일 응용할 수가 있다는 것을 기억하도록 하자.

Set의 기본 형태는 여기까지 알아보기로 하고, 스크립트에서 주로 사용하는 확장 형태를 알아보자.


Set의 확장 형태

SET 변수=문자열
여기에서 변수는 문자열을 저장할 공간의 이름을 말한다.
또한, Batch에서는 띄어쓰기(매우 중요!)가 짜증날 정도로 까다롭다.
SET 확장 형태에는 2가지의 스위치가 존재한다.

1. SET /A 스위치
/A 스위치는 인용부호( " )로 묶여진 부분을 수식으로 간주하여 계산한 결과를 반환한다.
일반적인 프로그래밍 언어나 수식 표현에서 쓰이는 방법과 차이가 없다.
수의 표현은 16진수는 0x를 시작으로 표기하며, 8진수는 0을 시작으로 표기한다.

()                          || 그룹 짓기
! ~ -                      || 단일 연산자
* / %                    || 산술 연산자
+ -                        || 산술 연산자
<< >>                   || 논리 이동
&                         || 비트단위 AND
^                         || 비트단위 상호 배제 OR (XOR)
|                          || 비트단위 OR
= *= /= %= += -=    || 할당
&= ^= |= <<= >>= , || 식 구분 기호

대부분이 기본적으로 쓰여지는 연산자이기에 별도의 설명은 하지 않겠다.
단, !의 경우 비트 전체를 기준으로 1이면 0을, 0이면 1을 반환하고, ~의 경우 비트 단위 NOT 연산임을 기억하자.
예를 들어 '''SET /A "2048 >> 2"'''라고 입력을 한다면, 결과로는 512가 출력될 것이다.
이어서, SET /A TEST="2048 >> 2" 라고 입력을 한 후에 ECHO %TEST% 라고 입력을 하면 저장된 TEST에 저장됬을 512가 출력이 될 것이다.
이런 식으로 /A 스위치는 "수식" 과 같은 형태로 사용이 되며, 다양한 방법으로 이용할 수가 있다..

2. SET /P 스위치
/P 스위치는 사용자에게 입력받은 값을 변수에 대입하는 옵션으로, 아래와 같은 형태를 가지고 있다.

  SET /P 변수=[promptString]

promptString은 일종의 안내 메시지다.

 SET /P TEST=값을 입력하세요. :

라고 입력을 할 경우, "값을 입력하세요. : " 라는 문구가 뜨면서 입력을 기다린다.
여기에선 1024를 입력한 후에 ECHO %TEST% 라고 입력을 하면 입력했던 1024가 출력된다.
즉, /P 스위치는 사용자의 입력을 변수에 바로 저장한다는 이야기이다.

또한, 출력되는 안내 메시지는 다양한 형태로 가공될 수가 있다.
예를 들어,

1
2
> SET /P TEST=%OS% : [Enter]
Windows_NT : [Waiting user input...]

내 기준으로는 이런 식의 출력이 보여진다.
하지만 여기에서 _NT를 _Se7en으로 바꾸어 보여주고 싶다면 어떻게하면 좋을까?
바로 이렇게 하면 된다.

1
2
> SET /P TEST=%OS:_NT=_Se7en% : [Enter]
Windows_Se7en : [Waiting user input...]

또한, 여기에서 _Se7en을 빼고 {{{SET /P TEST=%OS:_NT=%}}} 라고 입력한다면 _NT 부분만 제거가 된다.

끝으로, 문자열을 원하는 길이만큼만 출력하는 것도 가능하다.
기존의 프로그래밍 언어 등에서 Left, Right 등의 문자열 추출 함수와 같은 역할을 한다.

1
2
3
4
5
6
7
@ 앞에서부터 2개의 문자 제외
> SET /P TEST=%OS:~2% : [Enter]
ndows_NT : [Waiting user input]
  
@ 뒤에서부터 2개의 문자 표시
> SET /P TEST=%OS:~-2% : [Enter]
NT : [Waiting user input]

~ 기호 뒤에 숫자가 하나인 경우에는 그 숫자가 표시될 기준이 된다.

2라고 한 경우, Windows_NT라는 문자열의 2번째 위치인 i 이후부터 표시가 되고,
-2라고 한 경우, Windows_NT라는 문자열의 뒤에서부터 2번째 위치인 N부터 표시가 되는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@ 5번째 문자에서부터 2개의 문자만 표시
> SET /P TEST=%OS:~5,2% : [Enter]
ws : [Waiting user input]
  
@ 5번째 문자부터 시작, 뒤에서부터 2번째 문자까지 표시
> SET /P TEST=%OS:~5,-2% : [Enter]
ws_ : [Waiting user input]
  
@ 뒤에서부터 10번째 문자부터 시작, 3개의 문자만 표시
> SET /P TEST=%OS:~-10,3% : [Enter]
Win : [Waiting user input]
  
@ 뒤에서부터 10번째 문자부터 시작, 3개의 문자만 제외
> SET /P TEST=%OS:~-10,-3% : [Enter]
Windows : [Waiting user input]

~ 뒤에 2개의 숫자가 붙는 경우엔 양수, 음수에 따라 차이가 있다.

앞에 있는 숫자가 양수
 * 앞에서부터 시작하는 시작점
앞에 있는 숫자가 음수
 * 뒤에서부터 시작하는 시작점

뒤에 있는 숫자가 양수
 * 시작점에서부터 표시할 문자의 갯수
뒤에 있는 숫자가 음수
 * 뒤에서부터 제외할 문자의 길이

이러한 점을 이용하면 경로 등의 표시에서 상당히 유용하게 이용할 수 있을 것이다.