2014-10-09 3 views
2

텍스트 파일 (users.txt)에 사용자 목록이 있고 각 사용자가 해당 디렉토리의 모든 파일 (c : \ Folder \ )을 복사하려고합니다. username) 및 하위 디렉토리가없는 다른 디렉토리의 하위 디렉토리 (c : \ Folder 2 \ 사용자 이름).Windows 배치 파일 - 중첩 된 FOR 루프의 변수

는 지금 같은 것을 포함하는 배치 파일을 사용하고 있습니다 :

for /f %%u in (user.txt) do (
    for /r "C:\Folder\%%u" %%f in (*.*) do @xcopy "%%f" "C:\Folder 2\%%u" 
) 

을 ...하지만 작동하지 않습니다.

는 몇 가지 테스트 후 나는 무엇이 잘못되었는지 알 수 있었다 :

for /r "C:\Folder\%%u" %%f in (*.*) do @xcopy "%%f" "C:\Folder 2\%%u" 

에 대한 두 번째의 유 변수 첫 번째 %% 올바르게 이름로 대체되지 않습니다.
두 번째 %% u (DO 명령 내부)는 값으로 올바르게 대체됩니다.

첫 번째 %% 변수가 올바른 값을 갖도록하는 방법이 있습니까?

+1

의 같이 Recurse 절에서 첫 for 대체 매개 변수를 제거하는 것입니다 다른 폴더에 있습니까? – foxidrive

+0

FOR/F 인용 옵션은 FOR 변수 또는 지연된 확장을 사용할 수 없습니다. 다양한 파싱 단계가 이루어지는 순서와 관련이 있습니다. – dbenham

+0

@foxidrive 충돌은 없어야합니다 (적어도 현재 내가하고있는 일에 대해). 그래서 어떻게 대처해야할지 생각하지 않았습니다. 어쨌든 내가 할 필요가 있다면 가장 좋은 방법은 파일의 경로를 이름으로 변환하는 것입니다. – ChemClaude

답변

1

루프를 중첩하는 대신 서브 루틴을 호출하여이 작업을 수행 할 수 있습니다. 뭔가 같은 :

for /f %%u in (user.txt) do call :doxcopy %%u 
goto :eof 

:doxcopy 
for /r "C:\Folder\%1" %%f in (*.*) do @xcopy "%%f" "C:\Folder 2\%1" 
goto :eof 
3
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f %%u in (user.txt) do (
     pushd "C:\Folder\%%u" && (
      for /r %%f in (*) do @xcopy /i /y "%%f" "c:\Folder 2\%%u\" 
      popd 
     ) 
    ) 

하나의 간단한 해결책은 같은 이름을 가진 두 개의 파일이 존재하는 경우 파일 이름 충돌을 처리 할 방법 두 번째 for

+0

+1, 나는 더 우아한 해결책을 상상할 수 없다. – dbenham