배치 파일에서 변수로 파일 내용을 읽는 방법은 무엇입니까?


161

이 배치 파일은 TEST에서 LIVE로 빌드를 릴리스합니다. 이 파일에 특정 폴더에 수반되는 릴리스 문서가 있는지 확인하는 검사 제한 조건을 추가하고 싶습니다.

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

그래서 이것을 달성하는 방법에 대한 몇 가지 질문이 있습니다 ...

  1. 거기에있다 version.txt에서 파일 \\testserver\testapp$폴더,이 파일의 유일한 내용은 빌드 번호를 (예를 들어, 45 - 빌드 45) 어떻게의 내용을 읽습니까 version.txt배치 파일에서 변수로 파일을?

  2. \\fileserver\myapp\releasedocs\ {build}.doc{build} 대신에 파트 1의 변수를 사용하여 파일 이 존재 하는지 어떻게 확인 합니까?

답변:


300

파일 내용을 변수로 읽습니다.

for /f "delims=" %%x in (version.txt) do set Build=%%x

또는

set /p Build=<version.txt

둘 다 파일에서 한 줄로만 작동합니다. 더 많은 줄의 경우 for변형은 마지막 줄을 변수에 넣고 줄을 set /p사용합니다 .

변수는 다른 환경 변수와 마찬가지로 결국 하나입니다.

%Build%

따라서 존재를 확인하려면 :

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

UNC 경로가 허용되지 않을 수도 있습니다. 지금 이것을 테스트 할 수는 없지만 이것을 명심하십시오.


4
set방법은 약 1024 자만 읽습니다. 왜 그런가요?
Iulian Onofrei

12
아마도 안에있는 버퍼의 한계 때문일 것 cmd입니다. 신뢰할 수있는 스크립트를위한 끔찍한 언어입니다.
Joey

나는 파일에서 문자열을 바꾸기 위해 몇 시간 동안 고심했다.
Iulian Onofrei

16
@IulianOnofrei는 set /p호출 cmd!ReadBufFromInput스택 할당 된 버퍼와 1023 개 와이드 문자 (2046 바이트)를 읽을 수 있습니다. OEM / ANSI 문자 당 1 바이트를 가정하고 파일에서 1023 바이트를 읽지 만 OEM / ANSI 일 필요는없는 현재 코드 페이지를 사용하여 파일을 디코딩합니다. 최악의 경우는 코드 페이지 65001이며 4 바이트 UTF-8 문자로 채워진 파일입니다 (예 : 고대 스크립트). 255 개의 문자와 대체 문자 U + FFFD로 저장된 부분적으로 디코딩 된 문자를 얻을 수 있습니다.
Eryk Sun

3
@ 얀 : for /f "usebackq" %%x in ("path with spaces.txt") .... help for그건 그렇고,이 언급합니다.
Joey

46

다음과 같이 파일에서 여러 변수를 읽을 수 있습니다.

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

param.txt :

PARAM1=value1
PARAM2=value2
...

1
이것은 완벽한 솔루션입니다. 말 그대로 OP 대답에, (param.txt)해야 (version.txt)그것은 포함한다Build=45
robotik

이다 솔루션입니다.
JAIL

3
현재 %% G가 예기치 않았습니다.
John

4
직접 커맨드 라인에서 사용하기 위해, 모든 대체 : @ 존 %%G%G
스테판

32

그냥 해:

type version.txt

입력 한 것처럼 표시됩니다.

set /p Build=<version.txt
echo %Build%

4
@jeb 나는 그것을 알고 있지만, 내가 필요한 것이기 때문에 type 명령에 대해 여전히 감사합니다
MSM

형식 버전을 제공해 주셔서 감사합니다. 공유 디렉토리에있는 파일 내용에 액세스하여 필요한 것에 정확하게 작동합니다.
Tastybrownies

22

파일의 모든 행을 변수에로드하려면 지연 확장이 필요하므로 다음을 수행하십시오.

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

이 일부 특수 문자에 문제가있다, 특히하지만 ;, %!


전체를 둘러싼 set큰 따옴표로 표현식을 묶으면 적어도 일부 특수 문자의 문제점을 피할 수 set "Build=!Build!%%x"있습니다.
aschipfl

9
스크립트는 "echo is ON"을 출력합니다. 배치가 쓰레기 인 이유는 무엇입니까?
Trevor Hickey

지연 확장없이 나를 위해 작동합니다. set err= (다음 라인)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

2
배치가 쓰레기 인 이유는 무엇입니까? 일관성을 위해?
Jan Nielsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.