2016-07-19 4 views
2

컴퓨터 목록을 통해 이동하고 컴퓨터에서 파일을 읽은 다음 파일 이름을 구분하고 컴퓨터 이름과 파일 이름 결과를 반향 출력하는 배치 스크립트를 작성하려고합니다. 내가 겪고있는 문제는 중첩 된 FOR/R 명령으로 채울 컴퓨터 이름 변수를 얻는 것입니다.변수가있는 중첩 된 FOR

@ECHO OFF 
SetLocal EnableDelayedExpansion 
SET LIST=Computers.txt 
FOR /F %%A IN (%LIST%) DO (
    FOR /R \\%%A\c$\folder1\folder2 %%B IN (*.txt) DO (
     FOR /F "tokens=2 delims=." %%C IN ("%%B") DO (ECHO %%A %%C 
     ) 
    ) 
) 
EndLocal 

파일 이름은 RB-C1SRC20160716CL.P17.txt 같은 것입니다 : 여기 내 스크립트입니다. 그래서 내가 찾고있는 결과는

MyPCName P17 

입니다.하지만 결과가 비어 있습니다. 내가 찾은 것은 %% A var이 텍스트 파일에서 채워지지만 FOR/R의 %% A var이 채워지지 않는다는 것입니다. FOR 명령을 에코 (ECHO)하면 FOR/R \ MyPCName \ folder1 \ folder2 대신 FOR/R \ % a \ folder1 \ folder2가 표시됩니다. 이 고장으로 인해 나머지 스크립트가 제대로 작동하지 않게됩니다.

UPDATE :

덕분에 올바른 방향으로 날을 가리키는 위해 aschipfl합니다. 나는 마침내 스크립트를 작동시킬 수있었습니다.

@ECHO OFF 
SetLocal EnableDelayedExpansion 
SET LIST=Computers.txt 
FOR /F %%A IN (%LIST%) DO (
    SET WKSTN=%%A 
    CALL :SUB 
) 
EndLocal 
GOTO :EOF 

:SUB 
FOR /R \\%WKSTN%\c$\folder1\folder2 %%B IN (*.txt) DO (
     FOR /F "tokens=2 delims=." %%C IN ("%%B") DO (ECHO %%A %%C 
    ) 
) 
+1

관련 항목 : [배치 명령을 사용하여 하위 폴더의 크기 만 가져 오기] (http://stackoverflow.com/a/38397052) – aschipfl

답변

2

for /R 명령의 루트 디렉토리가 다른 for 변수에 의해 제공 될 수 없다 (같은 %%I)도 불행하게도, 지연 확장 (!VAR!)를 사용하여 변수 : 다음 작업 버전입니다. iterally, 일반적으로 확장 된 변수 (%VAR%) 또는 인수 참조 (%1, %2, ...)로 지정해야합니다.

좋은 해결 방법은 for /R 루프를 서브 루틴에 배치하고 call을 사용하여 주 루틴에서 호출하는 것입니다. 루트 경로를 보유하고있는 변수는 call의 인수로 전달되어야합니다. 서브 루틴에서는 인수 참조 (예 : %1)로 참조됩니다.

"Get size of the sub folders only using batch command"게시물의 this answer에서 어떻게 수행 할 수 있는지 확인하십시오.

관련 문제