, SS64.com은 나쁘지 않습니다. Rob van der Woude도 자주 연결됩니다. 문제에 관해서는
, 즉 쉽게 :
@echo off
setlocal enableextensions enabledelayedexpansion
set LIST=
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
echo %LIST%
endlocal
더 깊이있는 설명 :
setlocal enableextensions enabledelayedexpansion
우리는 여기에 확장 지연 가능하게하고 있습니다. 그렇지 않으면 다음에 나오는 for
루프 내의 파일 목록을 조작 할 수 없기 때문에 이것은 매우 중요합니다. 파일에 라인을 통해
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
for /f
반복은 정확히 그래서 우리는 여기에 필요합니다. 각 루프 반복에서 다음 줄을 LIST
변수에 추가합니다. 평소 %LIST%
대신 !LIST!
을 사용합니다. 이것은 지연된 확장 신호이며이 명령이 실행될 때마다 변수가 다시 평가되도록합니다.
보통 cmd
은 라인을 읽고 구문 분석하는 즉시 변수를 값으로 확장합니다. cmd
의 경우 한 줄은 라인이거나 이 카운트하는 인 줄입니다.이 줄은 여기에서 사용한 것과 같은 괄호로 구분 된 블록의 경우 그대로 유지됩니다. 따라서 cmd
의 경우 전체 블록은 루프 내부가 얼마나 자주 실행되는지에 관계없이 한 번 읽히고 구문 분석되는 단일 명령문입니다.
분명히
for /f %%x in (yourfile.txt) do (
set LIST= "%%x"
)
이 ISN : 우리는 (그 시점에서 빈) 대신 !LIST!
다음 변수의 값으로 즉시 교체되었을 것으로 여기 %LIST%
를 사용했을 루프는 다음과 같이 보였을 것입니다 경우
우리가 원하는 것. 지연된 확장은 값이 실제로 필요한 경우에만 변수가 확장되도록합니다. 이 경우 루프의 내부가 실행되어 파일 이름 목록을 구성합니다.
나중에 변수 %LIST%
또는 !LIST!
(이제는 더 이상 사용하지 않아도 됨)에 파일의 행 목록이 포함됩니다.
가 마지막으로 지연 환경 변수 확장에 대한 지원이 가
을 추가되었습니다
는 충분히 재미있게의 set
명령에 대한 도움말이 지연 확장을위한 정확히이 예제를 포함하고 있습니다. 이 지원은 항상 이 기본적으로 사용되지 않지만, 이/V 명령 CMD.EXE의 회선 스위치를 통해 사용/사용되지 않을 수 있습니다. CMD /?를 참조하십시오.
지연된 환경 변수 확장 텍스트의 라인이 실행하지 않을 때, 읽을 때 발생하는 현재의 확장 의 한계를 극복하는데 유용합니다. 다음 예는 바로 변수 확장과 문제를 보여줍니다
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
첫 번째 IF 문을 읽을 때 BOTH IF 문에있는 % VAR % 이후 이후, 대입, 메시지를 표시하지 않을 것 논리적으로는 은 IF의 본문을 포함하며, 이는 복합 문장입니다. 따라서 복합 문 안의 IF 은 이며 실제로는 "이전"과 "이후"가 동일하지 않은 을 실제로 비교합니다. 마찬가지로, 다음의 예는 예상 대로 작동하지 않습니다
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
는 현재 디렉토리에 파일의 목록을 구축되지 않습니다 점에서, 그러나 는 대신 마지막에 LIST에게 변수를 설정합니다 파일을 찾았습니다. FOR 문을 읽을 때 % LIST %가 으로 한 번만 확장되고 그 당시 LIST 변수가 비어 있기 때문입니다. 그래서 우리는 실행중인 루프에 대한 실제 입니다 만있는 마지막으로 파일 목록을 설정 유지
for %i in (*) do set LIST= %i
.
지연된 환경 변수 확장 는 실행시 환경 변수를 확장 에 다른 문자 (느낌표)를 사용할 수 있습니다.지연 변수 확장을 사용하는 경우 의도 한대로 이 작동하려면 다음과 같이 위의 예를 작성할 수 :
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
요하네스 : 철저한 답변을 주셔서 감사합니다 - 나는 조금 더 해요 지금 배치 파일에 대해 밝혀졌습니다. 여기에 새 스레드로 게시 한 관심있는 관련 질문이 있습니다. http://stackoverflow.com/questions/1506638/windows-batch-file-errorlevel-question – dls