对于批处理脚本中的循环参数名称

时间:2016-05-16 10:52:05

标签: batch-file

我正在编写一个脚本,使用批处理脚本遍历文件夹中的所有文件。我正在使用的命令是

for /r F:\foo\ %%i in (bar_*.txt) do echo %%i

这很好用。但如果我将%%i替换为%%files,我会收到一条错误%files was unexpected at this timedocumentation page表示只允许使用单个字符。这背后的原因是什么?有什么办法可以让我给变量一个更有意义的名字吗?

1 个答案:

答案 0 :(得分:0)

由于tokens=1,4,6-9功能,循环变量必须是单个字符变量,这对于任何名称的循环变量都是不可能的。

例如,从CSV文件input.csv,第一个数据列,第四个数据列和数据列6到9应写入CSV文件output.csv

@echo off
if not exist "input.csv" exit /B
if exist "output.csv" del "output.csv"
for /F "usebackq tokens=1,4,6-9 delims=," %%A in ("input.csv") do (
    echo %%A,%%B,%%C,%%D,%%E,%%F>>"output.csv"
)

注1:仅当每个数据行中没有空字段值时,此方法才有效。

如果循环变量可以有任何名称,Windows命令处理器也很难区分引用循环变量和环境变量。

您始终可以将循环变量的值分配给环境变量,并使用延迟扩展在循环内的其他命令行中使用环境变量。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /R F:\foo\ %%# in (bar_*.txt) do (
    set "FileName=%%#"
    echo Current file is: !FileName!
)
endlocal

注2:这仅适用于名称或路径中不包含!的文件名。

环境变量不区分大小写,但循环变量区分大小写。并避免使用字母作为循环变量,这些变量也可以解释为修饰符,例如使用%~nI%~nxI或类似的东西,因为这可能会有问题。

BTW:为什么不使用 COPY 选项/S XCOPY ROBOCOPY 来递归复制与通配符模式匹配的所有文件bar_*.txt