2013-03-10 47 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