cmd 파일에서 %와 %%의 차이점은 무엇입니까?


88

최근에 .cmd 파일에 다음과 유사한 줄을 포함했습니다.

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"

원래는 % f 만 사용했고 명령 줄에서 실행할 때는 제대로 작동하지만 파일을 통해 실행할 때는 제대로 작동하지 않습니다. %% f로 전환했을 때 파일에서 작동했습니다. 차이점이 무엇인지 궁금합니다.

답변:


138

(자세한 설명은 보관 된 Microsoft KB 문서 에서 찾을 수 있습니다 .)

알아야 할 세 가지 :

  1. 퍼센트 기호는 명령 줄 매개 변수를 나타 내기 위해 배치 파일에 사용되는 : %1, %2, ...
  2. 사이에 문자가있는 두 개의 퍼센트 기호는 변수로 해석됩니다.

    echo %myvar%

  3. (배치 파일에서) 사이에 아무것도 없는 두 퍼센트 기호 는 명령 (배치 파일이 아님)에서 단일 퍼센트 기호처럼 처리됩니다.%%f

그 이유는 무엇입니까?

예를 들어 (간단한) 명령 줄을 실행하면

FOR /f %f in ('dir /b .') DO somecommand %f

배치 파일에서 규칙 2

%f in ('dir /b .') DO somecommand %

변수로. 이를 방지하려면 규칙 3 을 적용 %하고 두 번째 로을 이스케이프해야합니다 %.

FOR /f %%f in ('dir /b .') DO somecommand %%f

21
배치 파일이 아닌 명령 프롬프트에서 직접 실행할 때 FOR 루프에서 1 % 기호 만 사용하면되는 이유에 대한 설명이 있습니까? DOS 유산에 대해 알고 있지만 이제 명령 줄에서 변수를 사용할 있습니다.
Alec Mev 2013 년

6
또한 변수가 단일 문자인지 확인하십시오.
jiggunjer

1
%가있는 명령을 실행하려면 어떻게해야합니까? 예 : for / f %% i in ( 'git log -1 --pretty = format : "%% H"') do set GIT_COMMIT = %% i
Tanka

15

DOS에서는 명령 줄에서 환경 변수를 사용할 수 없었고, %기호를 구분 기호로 사용한 배치 파일에서만 사용할 수있었습니다 . %예를 들어 echo명령문과 같이 배치 파일에서 리터럴 기호 를 원하면 두 배로 표시해야합니다.

이것은 명령 줄에서 환경 변수를 허용하는 Windows NT로 이어졌지만 이전 버전과의 호환성을 위해 여전히 %.cmd 파일에서 기호 를 두 배로 늘려야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.