我正在编写一个脚本,使用批处理脚本遍历文件夹中的所有文件。我正在使用的命令是
for /r F:\foo\ %%i in (bar_*.txt) do echo %%i
这很好用。但如果我将%%i
替换为%%files
,我会收到一条错误%files was unexpected at this time
。 documentation page表示只允许使用单个字符。这背后的原因是什么?有什么办法可以让我给变量一个更有意义的名字吗?
答案 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
?