批次失败将值设置为变量

时间:2013-03-10 19:36:12

标签: variables batch-file

这是我的代码:

@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”作为目标文件夹。错误在哪里?

1 个答案:

答案 0 :(得分:2)

解析行时会扩展

%et%,并且会同时解析整个外部带括号的FOR循环。因此,您获得的值是输入循环之前存在的值。

您可以通过启用延迟展开并使用!et!来解决问题。有关详细信息,请从命令行键入HELP FORFOR /?。有关延迟扩张的部分大约有一半的下降。

但根本不需要使用et变量。我相信你只想在内部循环的第一列与文件夹名称匹配时复制文件。只需移动并替换SET语句的COPY命令即可。在COPY声明中使用%%b代替%et%

没有必要,但我用PUSHD / POPD代替了CD命令。当指定路径时,使用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
)