배치 파일에서 이 줄을 사용하려고 합니다.
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. >> "
변수 이름이고 bar
은 USERPROFILE
리터럴 텍스트라고 생각합니다 . 예를 들어 "hello" 인수를 사용하여 명령을 실행하면 다음과 유사한 오류 메시지가 나타납니다.
명령 구문이 올바르지 않습니다. 씨:(현재 디렉토리)> "hellobarUSERPROFILE\Desktop\Log File.txt"가 아닌 경우)