IF 조건부 변수 검사와 같은 줄의 echo 문에서 백분율 기호(%) 사용

IF 조건부 변수 검사와 같은 줄의 echo 문에서 백분율 기호(%) 사용

배치 파일에서 이 줄을 사용하려고 합니다.

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

그리고 내가 그것을 실행하면 나는 이것을 얻습니다

) was unexpected at this time.

C:\>      If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")

(ARGUMENT = 배치 파일을 실행할 때 사용한 인수/매개변수)

"Log File.txt"를 "LogFile.txt"로 변경하고 경로 주변의 따옴표를 제거하는 등 모든 종류의 변형을 시도했으며 기호가 있을 때마다 중단된다는 사실로 범위를 좁혔습니다  %(에코를 시도하는 것에서). 변수) 또는 콜론(경로에서 오른쪽으로 >>). 나는 콜론 문제가 무엇인지 전혀 모르지만 %테스트중인 변수가 쌍으로 묶인 모든 내용과  %줄의 나머지 부분을 포함하는 전체 연결 문자열이라는 의미로 탐욕스럽고 줄을 읽는 것 같습니다. 그 뒤에는 연산자가 없으므로 EOL까지 계속 진행되어 괄호 안에 들어갑니다. 따라서 뭔가를 이스케이프해야 하거나 변경해야 할 다른 것이 있거나 불가능하거나 둘 중 하나인 것 같습니다.

나는 단순히 다음과 같이 다른 줄에 echo 문을 넣을 수 있다는 것을 알고 있습니다.

If NOT... (
  echo...
)

하지만 저는 한 줄로 하는 편이 낫습니다. 부분적으로는 더 깔끔하기 때문이기도 하지만 대부분은 제가 호기심이 많고 이런 것을 알아내는 걸 좋아하기 때문이고, 할 수 없는 것을 싫어하기 때문입니다.

그런데 지연된 표현이 활성화되었습니다.

편집: @AFH의 의견을 바탕으로 배치 파일에서 자체적으로 테스트한 결과 이 ​​사실을 발견했습니다.

@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

오류는 발생하지 않지만 퍼팅아무것그 이후(예: endlocal다음 줄 또는 빈 다음 줄)는 그렇습니다.하지만%1, ADH에서 언급한 대로 대신 사용하면 %1%문제가 해결되었으므로 문제가 되었습니다. 그러므로 이것이 해결되었습니다.

답변1

정확한 오류를 재현할 수는 없지만 확인할 수는 있습니다.AFH의 관찰명령줄 매개변수는 (예:  , 등)이고 가 아니므 로 명령은 다음과 같아야 합니다.%n%1%2%n%

If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

나는 당신이 extra 를 포함할 때 무슨 일이 일어나는지에 대해 어느 정도 밝힐 수 있다고 믿습니다  %. CMD는 다른 작업을 수행하기 전에 매개변수와 변수에 대한 명령줄을 구문 분석하는 것으로 보이며 매우 단순한 구문 분석기를 사용합니다. 을 만나면  %,

  • 다음 문자가 숫자이면 위치 매개변수입니다.%n
  • 다른 것이면 변수( )이고%name%모든 것다음 %까지는name. 일치하는 항목이 없으면 정말 혼란스러울 것 같아요 %.

명령이 구문 분석되는 방법은 다음과 같습니다.

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
        \/\---------------/   \-----------/           \---------------------- ...?

"=="foo" (echo 과 는  Text. >> "변수 이름이고 barUSERPROFILE리터럴 텍스트라고 생각합니다 . 예를 들어 "hello" 인수를 사용하여 명령을 실행하면 다음과 유사한 오류 메시지가 나타납니다.

명령 구문이 올바르지 않습니다.
 
씨:(현재 디렉토리)> "hellobarUSERPROFILE\Desktop\Log File.txt"가 아닌 경우)

관련 정보