2013-03-10 99 views
1

這是我的代碼:批量故障設定值的變量

@echo off 
Setlocal EnableDelayedExpansion 

set log=C:\mylog.log 

set ftpFolder=C:\contributor\ftp 
set rotterdamFolder=C:\rotterdam 

cd /D C:\contributor 
echo [FTP Folder: %ftpFolder%] >> %log% 
cd /D %ftpFolder% 

for /D %%f in (*) do (
cd %%f 
for %%i in (*) do (  
    echo [FTP, %%f] Sending %%i >> %log% 
    for /f "tokens=1,2" %%a in (C:\input.txt) do (
     if %%a==%%f ( 
      set et=%%b    
      ) 
     ) 
    copy %ftpFolder%\%%f\%%i %rotterdamFolder%\%et% >> %log% 
) 
cd .. >> %log% 
) 

input.txt的文件是一樣的東西:

007 87855 
008 87823 
015 87830 

這不是重要的兩個列是如何劃分(製表符或空格)。 我的問題是%et%變量沒有定義。這怎麼可能?我需要使用變量「b」作爲目標文件夾。錯誤在哪裏?

回答

2

%et%在解析該行時展開,並且整個外部帶括號的FOR循環一次全部解析。所以你得到的價值是你的循環進入之前的價值。

您可以通過啓用延遲擴展並使用!et!來解決問題。請從命令行輸入HELP FORFOR /?以獲取更多信息。關於延期擴張的部分大約是一半。

但是確實沒有任何需要使用et變量。我相信你只想在內部循環的第一列與文件夾名稱相匹配時複製文件。簡單地移動並替換SET語句的COPY命令。在COPY語句中使用%%b而不是%et%

這不是必須的,但我用CD命令替換了PUSHD/POPD。當指定路徑時,使用CD進行重定向毫無意義。

如果包含空格或特殊字符,你應該引用你的路徑。

for /D %%f in (*) do (
    pushd "%%f" 
    for %%i in (*) do (  
    echo [FTP, %%f] Sending %%i >> %log% 
    for /f "tokens=1,2" %%a in (C:\input.txt) do if "%%a"=="%%f" (
     copy "%ftpFolder%\%%f\%%i" "%rotterdamFolder%\%%b" >> %log% 
    ) 
) 
    popd 
) 
+0

您的代碼不在代碼塊中,我不想觸摸它。 – 2013-03-10 21:29:58

+0

糟糕,我忘了將代碼格式化爲代碼。所有固定。 – dbenham 2013-03-10 21:39:08