문제

나는 다음과 같은 말도 안되는 과제를 달성하려고 노력하고 있습니다.

완전한 자격을 갖춘 파일 이름 세트가 포함 된 텍스트 파일이 있습니다. 파일을 반복하고 각 줄을 공통 변수로 추가하여 명령 줄 도구로 전달할 수 있습니다. 예를 들어 파일은 다음과 같습니다.

C : dir test.txt

C : windows test2.txt

C : text3.txt

그리고 나는 그것들을 몇 가지 변수 'a'에 할당하고 싶습니다.

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

보조 질문은 - 좋은 배치 파일 참조는 무엇입니까? 나는 Windows 자료와 많은 집에서 재배 된 웹 사이트에서 물건을 찾고 있지만 특히 완전한 것은 없습니다.

도움이 되었습니까?

해결책

참조와 관련하여 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 완전한 블록은 루프 내부가 얼마나 자주 실행되는지에 관계없이 한 번 읽고 구문 분석하는 단일 문자입니다.

우리가 사용했을 경우 %LIST% 여기서 대신 !LIST! 그런 다음 변수는 즉시 그 값으로 바로 교체되었을 것입니다 (그 시점에서 비어 있음). 루프는 다음과 같이 보였을 것입니다.

for /f %%x in (yourfile.txt) do (
    set LIST= "%%x"
)

분명히 이것은 우리가 원하는 것이 아닙니다. 지연된 확장은 변수가 값이 실제로 필요한 경우에만 확장되도록합니다. 이 경우 루프 내부가 파일 이름 목록을 실행하고 구성하는 경우.

그 후 변수 %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 문을 읽을 때 두 IF 문의 % var %가 대체되기 때문에 메시지를 표시하지 않을 것입니다. IF의 본문이 논리적으로 포함되므로 복합 문자입니다. 따라서 화합물 내부의 IF는 실제로 "이전"과 "이전"과 비교하여 결코 동일하지 않을 것입니다. 마찬가지로 다음 예제는 예상대로 작동하지 않습니다.

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %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%

다른 팁

당신이 후에 무엇을 할 수 있습니다 을 위한 /f 명령.

여기에 여러 번 사용한 좋은 리소스가 있습니다.

http://www.robvandanderwoude.com/batchfiles.php

좋은 책 : Tim Hill의 Windows NT 쉘 스크립팅. 내가 가진 판은 1998 년에 출판되었지만 여전히 Windows 2008의 Windows Command 프로그램에 유효합니다.

type *commonfilepart* >> concat_result_file

OS : Windows Server 2003

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top