2012-03-16 2 views
0

한 줄에 두 개의 텍스트를 결합하는 배치 파일을 작성하려고합니다. 첫 번째는 파일 이름입니다. 두 번째 줄은 "받는 사람 :"으로 시작하는 텍스트의 첫 번째 줄입니다. 나는 몇 시간 동안 고생하고 있는데 이것은 내가 얻은 것까지이다.배치 - 루프의 한 줄에 두 조각의 텍스트 결합

@echo off 
IF EXIST fullnames.txt DEL fullnames.txt 
FOR /F %%g IN ('dir /b *.eml') DO (
SET filename=%~f1 
SET toline=FINDSTR /B /C "To: " 
ECHO %FILENAME%%TOLINE% >> fullnames.txt 
) 

그리고 작동하지 않는다. 나는 파일 이름 줄에 무엇을 넣었는지에 관계없이 오류나 잘못된 결과를 얻고있다. 심지어는 인라인 부분을 테스트하기 시작하지 않았습니다. 어떤 제안?

답변

0

for 루프 내에서 환경 변수를 할당하고 사용할 수 없습니다. 지연된 변수 확장을 사용하거나 서브 루틴을 호출하십시오. 어쨌든 제대로 작동 것처럼 보이지 않는, 그러나이

setlocal EnableDelayedExpansion 

    @echo off 
    IF EXIST fullnames.txt DEL fullnames.txt 
    FOR /F %%g IN ('dir /b *.eml') DO (
    SET filename=%~f1 
    SET toline=FINDSTR /B /C "To: " 
    ECHO !FILENAME!!TOLINE! >> fullnames.txt 
    ) 

처럼 보일 것이다 지연

. 나는 이렇게 할 것이다

+0

그러나 "받는 사람 :"은'설정 toline = FINDSTR/B/C는'_execute_하지 않습니다' FINDSTR' 명령은 텍스트 만 지정합니다. – jeb

2

DIR 명령의 출력을 캡처하기 위해 이미 FOR/F를 사용했다. FINDSTR의 출력을 캡처하는 것도 마찬가지입니다.

그러나 DIR 명령과 함께 FOR/F 대신 간단한 FOR을 사용하는 것이 더 효율적입니다.

내가 %%~fg라고 생각하면 %~f1을 사용했습니다.

% var %를 사용하여 괄호 안에 변수 세트를 확장 할 수 없으면! var! 대신 확장을 지연 시켰습니다. 자세한 내용은 명령 줄에서 SET /?을 입력 - 로 시작하는 섹션을 읽어 "마지막으로, 지연된 환경 변수 확장에 대한 지원이 이 추가되었습니다 ..."

그러나, 귀하의 경우, 당신은 쉽게 지연 사용 방지 할 수 있습니다 확장 (문제가 아니라).

기존 "fullnames.txt"를 삭제 한 다음 출력을 추가하는 대신 전체 구문을 괄호로 묶고 모든 출력을 덮어 쓰기 모드를 사용하여 파일로 리디렉션하는 것이 더 효율적입니다.

@echo off 
(
    for %%F in (*.eml) do (
    for "delims=" %%A in ('findstr /b /c:"To: " "%%F"') do echo %%F %%A 
) 
) >fullnames.txt 

그러나 위의 해결 방법은 단순한 것보다 훨씬 복잡합니다.

FINDSTR은 와일드 카드로 지정된 여러 파일을 처리 할 수 ​​있으며 각 일치하는 줄의 앞에 파일 이름과 콜론이 붙습니다.

당신은 배치 파일을 사용하지 않고 명령 줄에서 간단하게 결과를 얻을 수 있습니다 (또는 배치 파일에 넣고 수) :

findstr /b /c:"To: " *.eml >fullnames.txt 

편집
을 당신이이 염려되는 경우 파일은 여러 줄이 "다음"로 시작 포함되어있을 수 있습니다, 그리고 당신은 단지 다음 배치 파일을 사용하여 다시이며, 첫 번째 줄을 사용하려면 :

@echo off 
setlocal enableDelayedExpansion 
set "prevFile=" 
(
    for /f "tokens=1* delims=:" %%A in ('findstr /b /c:"To: " *.eml') do (
    if "%%A" neq "!prevFile!" echo %%A: %%B 
    set "prevFile=%%A" 
) 
) >fullnames.txt 

위의 솔루션 수 F 파일 이름이 ! 인 경우 ail.또한 경로에 드라이브 문자가없는 한 *.eml과 함께 경로를 사용할 수 있습니다. 드라이브와 ! 문제는 추가 수정으로 해결할 수 있습니다.

2
@echo off 
setlocal EnableDelayedExpansion 
if exist fullnames.txt del fullnames.txt 
for %%f in (*.eml) do (
    set toline= 
    for /F "delims=" %%l in ('findstr /B /C:"To: " "%%f"') do (
     if not defined toline set "toline=%%l" 
    ) 
    echo %%f!toline! >> fullnames.txt 
) 

EDIT는 : 간단한 방법은

각 파일을 처리하기 전에 set toline= 명령 'toline'변수는 "다음"때문에 단지 제 삭제할 첨가 발견 정합 라인에 할당된다 및 나중에 지연 확장을 사용하여 표시됩니다. dbenham 제안 그러나,이 과정은 확장을 지연 필요로하지 않는 간단한 방법으로 달성 될 수있다 :

@echo off 
if exist fullnames.txt del fullnames.txt 
for %%f in (*.eml) do (
    set firstFind= 
    for /F "delims=" %%l in ('findstr /B /C:"To: " "%%f"') do (
     if not defined firstFind set firstFind=now & echo %%f%%l >> fullnames.txt 
    ) 
) 
+0

첫 번째 "To :"행 처리가 시도됩니다. 또한 지연된 확장이 필요하지 않습니다. 내부 루프 내에서 :'정의되지 않은 경우 toline = 1을 설정하고 & echo %% f %% l >> fullnames.txt' – dbenham

+0

@dbenham : 왜 첫 번째 "To :"행의 프로세스가 도청되었다고 했습니까? – Aacini

+0

죄송합니다 Aacini, 내 부분에 멍청한 실수. 코드가 완벽하게 작동합니다. – dbenham

관련 문제