Windows에서 연산자 "=

Windows에서 연산자 "=

다음 배치 파일이 있습니다.

SET /P FOO=<"foo.txt"

이는 에서 제안한 대로 foo.txt변수 의 내용을 읽으려는 시도입니다 .FOO배치 파일의 변수로 파일 내용을 읽는 방법은 무엇입니까? . 이 방법은 이전에 나에게 잘 작동했습니다.

스크립트를 실행하면 다음과 같은 결과가 출력됩니다.

SET /P FOO= 0<"foo.txt"

이는 표시 오류일 뿐만 아니라 값이 변수로 읽혀지지 않습니다. 왜 이런 일이 발생합니까? 이 문제를 어떻게 해결합니까?

여러 컴퓨터에서 이 현상이 나타나는데 EOL 또는 인코딩 문제가 원인이 아닌 것 같습니다.

답변1

작동하지 않는 것이 확실합니까? 문제를 재현하려고 시도했는데 얻은 결과는 다음과 같습니다.

D:\>notepad test.bat //i've put SET /P FOO=<"foo.txt" inside it
D:\>echo asdf > foo.txt
D:\>test.bat
D:\>SET /P FOO= 0<"foo.txt"
D:\>echo %FOO%
asdf
D:\>

따라서 추가되지만 0<여전히 파일 내부의 데이터를 변수에 적용합니다.

답변2

초기 질문에 답하려면 @grawity로지적했다=<는 의 짧은 형식입니다 . = <0이는 완벽하게 훌륭한 구문이며 실제로 예상대로 작동합니다(일단 테스트하면바르게).

따라서 출력에는 아무런 문제가 없으며 다른 문제를 조사할 때 그것은 단지 빨간 청어였습니다.

다음과 유사한 코드 조각과 관련된 문제입니다.

@ECHO OFF
SETLOCAL
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO %TEST%
)

Pass이것을 실행할 때 출력은 에서 읽어야 하므로 출력이 될 것으로 예상했지만 foo.txt출력은 입니다 Fail. 나는 이것이 "mangled" 구문 때문이라고 의심했습니다.

그러나 @Joey처럼지적했다, 이 동작은 다음과 관련이 있습니다.지연된 확장.

위의 코드가 작동하게 하려면 다음과 같이 다시 작성해야 합니다.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO !TEST!
)

관련 정보