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


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.