다음 배치 파일이 있습니다.
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!
)