2014-10-09 177 views
2

我有一個文本文件(users.txt)中的用戶列表,我希望爲每個用戶複製其目錄中的每個文件(c:\ Folder \ 用戶名)和子目錄中的另一個目錄沒有子目錄(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命令中)正確地被它的值替換。

有沒有辦法強制第一個%% u變量採取正確的值?

+1

遞歸條款中刪除第一for替換參數,你會如何處理文件名衝突,如果存在兩個文件具有相同名稱在不同的文件夾? – foxidrive 2014-10-09 05:50:54

+0

FOR/F帶引號的選項不能使用FOR變量或延遲擴展。它與各種分析階段發生的順序有關。 – dbenham 2014-10-09 11:50:45

+0

@foxidrive不應該有碰撞(至少我現在正在做什麼),所以我沒有考慮如何處理它。無論如何,如果我需要這樣做,我認爲最好的辦法是將文件路徑轉換爲名稱。 – ChemClaude 2014-10-15 19:56:09

回答

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 2014-10-09 11:48:40

相關問題