수색…


선언

간단한 변수를 만들고 값 또는 문자열에 할당하려면 SET 명령을 사용하십시오.

SET var=10

여기서 코드는 값이 10 새 변수 var 을 선언합니다. 기본적으로 모든 변수는 내부적으로 문자열로 저장됩니다. 이것은 값 10foo1234 또는 Hello, World!foo1234 않음을 의미합니다 Hello, World!

따옴표에 대한 참고 사항

사용 된 따옴표는 변수의 값에 포함됩니다.

SET var="new value"             <-- %var% == '"new value"'

변수의 공백

배치 언어는 공백을 변수 이름의 수용 가능한 부분으로 간주합니다. 예를 들어, set var = 10 은 값 10 을 포함하는 var 라는 변수를 생성합니다 ( var 의 오른쪽과 10의 왼쪽에 여분의 공백이 있음).

따옴표를 사용하여 공백을 제거합니다.

공백을 방지하려면 전체 할당을 따옴표로 묶습니다. 변수 명과 값 이렇게하면 줄 끝 부분에 우발적으로 뒤 공백이 것을 방지 할 수 있습니다 ( 문자는 공백을 나타냄).

SET␣var=my␣new␣value␣           <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣         <-- '%var%' == 'my new value'

또한 & 또는 | 사용하여 여러 명령문을 결합 할 때 따옴표를 사용 | - 또는 변수의 끝 부분에 직접 기호를 추가하십시오.

SET var=val & goto :next        <-- '%var%' == 'val '
SET "var=val" & goto :next      <-- '%var%' == 'val'
SET var=val& goto :next         <-- '%var%' == 'val'

용법

echo %var%

이 코드는 var 의 값을 표시합니다.

setLocal EnableDelayedExpansion 이 사용되면 다음은 var 의 값을 표시합니다 (표준 표현식 % var %는 해당 컨텍스트에서 작동하지 않습니다).

echo !var!

배치 파일에서 변수는 명령의 일부 또는 다른 변수의 일부로 포함하여 모든 컨텍스트에서 사용할 수 있습니다. 변수를 정의하기 전에 호출 할 수 없습니다.

변수를 명령으로 사용 :

set var=echo
%var% This will be echoed

다른 변수에서 변수 사용 :

set var=part1
set %var%part2=Hello
echo %part1part2%

변수 대체

다른 프로그래밍 언어와 달리 배치 파일에서 배치 스크립트가 실행 되기 전에 변수가 실제 값으로 대체됩니다. 즉, 스크립트가 나중에 실행될 때가 아니라 명령 프로세서가 스크립트를 메모리로 읽어 들일 때 대치가 이루어집니다.

이 스크립트 내의 명령어와 같은 변수의 사용을 가능하게하고, 등 스크립트 다른 변수 이름의 일부 행을 받아이 문맥에서 "스크립트"로 - 또는 블록 - 코드, 괄호로 둘러싸여 : () .

그러나이 동작은 블록 내에서 변수의 값을 변경할 수 없다는 것을 의미합니다!

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    ECHO %VAR%
    SET VAR=Goodbye
)

인쇄 할 것이다.

Hello
Hello

이후 (명령 창에서 스크립트가 실행되는 것을 보는 경우) 다음과 같이 평가됩니다.

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo Hello
    SET VAR=Goodbye
)

위의 예에서 ECHO 명령은 스크립트가 메모리로 읽혀질 때 Hello 로 평가되므로 스크립트는 Hello 영원히 에코합니다. 그러나 스크립트를 통해 많은 패스가 만들어집니다.

스크립트가 실행되는 동안 확장되는 변수의 "전통적인"가변 동작을 달성하는 방법은 "지연된 확장"을 활성화하는 것입니다. 여기에는 루프 명령 (일반적으로 배치 스크립트의 FOR 루프) 이전에 스크립트에 명령을 추가하고 변수 이름에 백분율 기호 (%) 대신 느낌표 (!)를 사용하는 것이 포함됩니다.

setlocal enabledelayedexpansion 
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo !VAR!
    SET VAR=Goodbye
)
endlocal

인쇄 할 것이다.

Hello
Goodbye

구문 %%a in (1,1,2) 는 루프가 2 번 실행되도록합니다. 첫 번째 경우 변수는 'Hello'의 초기 값을 유지하지만 두 번째 루프에서는 두 번째 실행 SET 명령을 1 차 통과의 마지막 동작으로 수정 - 이것은 'Goodbye'수정 값으로 변경되었습니다.

고급 변수 대체

이제 고급 기술입니다. CALL 명령을 사용하면 일괄 처리 명령 프로세서가 스크립트의 동일한 행에 위치한 변수를 확장 할 수 있습니다. 이는 반복되는 CALL 및 수정 자 사용에 의해 다단계 확장을 제공 할 수 있습니다.

이것은 예를 들어 FOR 루프에서 유용합니다. 다음 예제와 같이 번호가 매겨진 변수 목록이 있습니다.

"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"

다음 FOR 루프를 사용하여이 작업을 수행 할 수 있습니다.

setlocal enabledelayedexpansion
for %%x in (%*) do (
    set /a "i+=1"
    call set path!i!=%%~!i!
    call echo %%path!i!%%
)
endlocal

산출:

c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt

변수 !i! 먼저 초기 값인 1로 확장되고 결과 변수 % 1은 실제 값인 c:\MyFiles\test1.txt 로 확장됩니다. 이것은 변수 i두 배 확장 입니다. 다음 행에서, i 다시 배를 이용하여, 확장 CALL ECHO 함께 가진 명령 %% 변수 프리픽스 다음 화면에 출력 (즉, 화면 상에 표시).

루프를 통과 할 때마다 초기 숫자가 1 씩 증가합니다 (코드 i+=1 로 인해). 따라서,이 증가로 2 루프를 통한 제 2 패스 및 행 3 3 패스. 따라서 화면에 표시되는 문자열은 각 패스마다 변경됩니다.

여러 변수 선언

일괄 처리의 시작 부분에 여러 변수가 정의 된 경우 대체 문자열을 사용하여 짧은 정의 형식을 사용할 수 있습니다.

@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"

for /f %%l in ('set _') do echo %%l
exit /b

_A=good
_D=6
_E=bad
_G=ugly

위의 예에서 변수는 화면에 인쇄 될 때 기본적으로 알파벳순으로 정렬됩니다.

변수를 배열로 사용하기

SET 문에서 공백을 사용하여 배열과 유사하게 동작 할 수있는 변수 집합을 만들 수 있습니다 (실제 배열 객체는 아 SET .

@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
    echo %%a
)
echo Get the variable directly: %var%

결과:

A
"foo bar"
123
Get the variable directly: A "foo bar" 123

특정 정보를 검색 할 수 있도록 인덱스를 사용하여 변수를 선언 할 수도 있습니다. 이렇게하면 배열이 환상적으로 여러 변수가 생성됩니다.

@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
    echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%

결과:

A
foo bar
123
Get one of the variables directly: foo bar

위의 예제에서, var 는 독자적으로 존재하지 않기 때문에 원하는 인덱스가 무엇인지 명시하지 않고는 var 를 참조 할 수 없습니다. 이 예제는 또한 !var[%%a]! 의 느낌표와 함께 setlocal enabledelayedexpansion 을 사용합니다 !var[%%a]! . 변수 대체 범위 문서 에서 이에 대한 자세한 정보를 볼 수 있습니다.

변수에 대한 연산

set var=10
set /a var=%var%+10
echo %var%

var 의 최종 값은 20입니다.

IF 조건이나 FOR 루프에서 사용되는 명령 블록 내에서 두 번째 행은 표준 환경 변수 확장 대신 지연된 확장이 필요하므로 작동하지 않습니다.

다음은 명령 블록에서도 작업하는 또 다른 좋은 방법입니다.

set var=10
set /A var+=10
echo %var%

명령 프롬프트 환경은 부호있는 32 비트 정수 값을 지원합니다.

  • 가산 ++=
  • 빼기 --=
  • 곱셈 **=
  • division / and /=
  • 모듈러스 분할 %%=
  • 비트 AND &
  • 비트 OR |
  • 비트 NOT ~
  • 비트 XOR ^
  • 비트 왼쪽 시프트 <<
  • 비트 오른쪽 시프트 >>
  • 논리적 인 NOT !
  • 단항 마이너스 -
  • ()

Windows 명령 해석기는 64 비트 정수 값 또는 산술 식의 부동 소수점 값을 지원하지 않습니다.

참고 : 연산자 % 는 연산자로 해석 될 %% 로 배치 파일에 작성되어야합니다.

set /A Value=8 % 3 명령 줄을 실행하는 명령 프롬프트 창에서 값 2 를 환경 변수 Value 할당하고 추가로 2 출력합니다.

배치 파일에서 값 2 를 환경 변수 Value 에 할당하려면 set /A Value=8 %% 3 으로 작성해야하며 STDOUT (표준 출력)을 처리하기 위해 각각 출력되는 Value 은 없습니다. 배치 파일에서 라인 set /A Value=8 % 3 은 배치 파일 실행시 오류 메시지 누락 연산자 를 초래합니다.

환경에서는 일반 문자열 변수가 아닌 산술 연산에만 스위치 /A 가 필요합니다.

set /A 이후의 산술 식의 모든 문자열은 숫자 또는 연산자가 환경 변수의 이름으로 자동 해석되는지 여부를 나타냅니다.

이런 이유로 %variable% 또는 !variable! 을 사용하여 변수의 값을 참조합니다 !variable! 변수 이름은 단지 첫 번째 문자로 시작하는 명령 블록 내의 특히 유용 디지트없는 단어 문자 (0-9A-ZA-Z_)로 구성 할 때 필요하지 않다 ( 그리고 매칭 종료 ) .

숫자는 C / C ++ 함수로 정수로 변환되는 문자열 strtol 함수base 쉽게 예상하지 못한 결과가 발생할 수있는 자동베이스 판정 수단 제로인.

예:

set Divided=11
set Divisor=3

set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor

echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%

set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3

echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%

set /A Result%%=7
echo -90 %%= 7 = %Result%

set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue

echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%

이 예제의 결과는 다음과 같습니다.

11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4

산술 표현식 평가시 정의되지 않은 변수는 값 0으로 대체됩니다.

입력에서 변수 설정하기

SET 명령에 /p 스위치를 사용하면 입력에서 변수를 정의 할 수 있습니다.

이 입력은 사용자가 될 수 있습니다. 입력 (키보드) :

echo Enter your name : 
set /p name=
echo Your name is %name%

다음과 같이 단순화 할 수 있습니다.

set /p name=Enter your name :
echo Your name is %name%

또는 파일에서 입력을 얻을 수 있습니다.

set /p name=< file.txt

이 경우 file.txt 에서 첫 번째 줄 값을 가져옵니다.

파일에서 다양한 행의 가치 얻기 :

(
   set /p line1=
   set /p line2=
   set /p line3=

) < file.txt


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow