2017-12-27 20 views
-2

특정 경로의 폴더에서 파일을 검색해야하는 경우가 있습니다. 파일 이름 목록이 들어있는 .csv 파일이며 지정된 디렉토리에서 해당 파일을 찾으려고합니다. .csv 파일에 언급 된 파일이 검색 경로에 없으면 오류 메시지가 표시됩니다. 파일을 읽고 폴더에서 찾는 방법

우리는 아래의 스크립트를 시도했지만 작동하지 않습니다 :

set InputFile=C:\Users\336727\Desktop\arun\SearchMCSentry\inputs.csv 
:start 
for /f "tokens=*" %%A in ('type "%InputFile%"') do ( 
    set "Found=1" 
     for /R %%f in ("%%A") do ( 
    echo ---%%f and Found = %Found% 
      if exist %%f (
      set Found=2 
    echo ====%%A and Found = %Found% 
      pause 
      ) 
    echo %%A and Found = %Found% 
     ) 
    if %Found%==1 goto :error 

    ) 
    :error 
    echo File not found 

당신은 pls는 이것을 달성하는 방법을 우리에게 도움이 없습니다.

덕분에, Parag

+2

'지연된 확장'을 위해 상단 표시 줄의 기능을 사용하여 검색하십시오. 그것은'발견 '의 가치에 대한 당신의 기대가 충족되지 못하는 이유를 설명해야합니다. 'for .. %% A ...'의 전체 본문은'존재하지 않는다면 '로 대체 될 수 있습니다. %% "goto error'는 플래그 문제를 완전히 처리합니다. – Magoo

+1

* "작동하지 않습니다"*는 문제가 아닙니다. [ask]를 읽으십시오. – IInspectable

답변

0

당신은 delayedexpansion의 함정에 빠진했다. 라인이 실행되면 DOS에서 실행 된 배치 스크립트에서 확장

을 지연 무엇


는 변수 확장 (그 값으로 전환)된다. 즉, 프로세서가 for 루프를 실행하기 시작할 때 for 루프의 모든 변수가 확장됩니다.

귀하의 케이스

변수 %found%가 이전에 설정되어 있지

(적어도 내가 볼 수있는). 루프가 실행될 때 따라서, 이러한 상황이 발생합니다

if ==1 goto :error 

이 방법을

이 지연 확장을 활성화 수정 (수 있도록 확장, 런타임에 있지 구문 시간을 발생). 루프 전에이 줄을 추가

setlocal enableDelayedExpansion 

프로세서가 실행 시간에 그것을 확장 할 필요가 이해할 수 있도록 !found!%found%을 변경합니다.

0

다른 방법 - 당신이 delayed expansion 마음에 들지 않으면 CALL SET

, 당신은 효과를 모방 call set를 사용할 수 있습니다.

call set found=1 
call echo %%found%% 

call command 트릭 for, if를 제외한 모든 명령에 작동합니다. CALL REM은 부분적으로 만 작동합니다.

절대적으로 필요한 경우가 아니면 delayed expansion을 사용하는 것이 좋습니다. CALL SET의 속도가 느립니다.