这是我的代码:
@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”作为目标文件夹。错误在哪里?
答案 0 :(得分:2)
%et%
,并且会同时解析整个外部带括号的FOR循环。因此,您获得的值是输入循环之前存在的值。
您可以通过启用延迟展开并使用!et!
来解决问题。有关详细信息,请从命令行键入HELP FOR
或FOR /?
。有关延迟扩张的部分大约有一半的下降。
但根本不需要使用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
)