2009-09-30 7 views
1

다음과 같은 우스운 작업을 수행하려고합니다.Windows XP 배치 파일 concat

정규화 된 파일 이름 집합이 들어있는 텍스트 파일이 있습니다. 나는 파일을 반복하여 명령 행 도구에 전달할 수있는 공통 변수에 각 행을 추가하려고합니다. 예를 들어, 파일이있을 수 있습니다

C : \ 디렉토리 \ TEST.TXT

C : \ WINDOWS \

C test2.txt가 : \ text3.txt

좋은 바 무엇인가 -

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt" 

보조 질문은 : 나는 몇 가지 변수 '는이'도록에 할당하고 싶습니다 tch 파일 참조? 나는 윈도우즈 머티리얼과 홈 메이드 웹 사이트에서 몇 가지 물건을 찾고 있습니다.

답변

9

, 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% 
+0

요하네스 : 철저한 답변을 주셔서 감사합니다 - 나는 조금 더 해요 지금 배치 파일에 대해 밝혀졌습니다. 여기에 새 스레드로 게시 한 관심있는 관련 질문이 있습니다. http://stackoverflow.com/questions/1506638/windows-batch-file-errorlevel-question – dls

0

좋은 책 : 팀 힐에 의해 윈도우 NT 쉘 스크립팅. 내가 가진 판은 1998 년에 출판되었다하지만 Windows에서 Windows 명령 프로그램을 여전히 유효 2008 년

0
type *commonfilepart* >> concat_result_file 

OS : Windows Server 2003의