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

4

1 回答 1

2

%et%解析行时展开,并且一次性解析整个外圆括号 FOR 循环。因此,您获得的值是进入循环之前存在的值。

您可以通过启用延迟扩展并改为使用!et!来解决问题。键入HELP FORFOR /?从命令行获取更多信息。关于延迟扩展的部分大约下降了一半。

但实际上根本不需要使用该et变量。我相信您只想在内循环的第一列与文件夹名称匹配时复制文件。只需移动 COPY 命令并将其替换为 SET 语句。在 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
)
于 2013-03-10T21:14:13.390 回答