我正在尝试在 Windows XP 的命令行中使用 FOR 命令。我有一个包含 3 行的文件 temp.txt:
temp1
temp2
temp3
我在提示符下输入以下命令:
for /F %p in (temp.txt) do echo Testing %p
什么都没有返回。如果我删除 /F 参数,则输出为Testing temp.txt
。
据我所知,我使用的命令与原先完全相同由 Microsoft 记录。我检查了我的注册表以确保命令扩展已打开,甚至还启动了一个新的 shell 以cmd /e:on
确保万无一失。
我究竟做错了什么?
是的,我做错了什么。
文件 temp.txt 不是从头创建的,我只是对其进行了编辑以放入我的测试内容。不幸的是,当我第一次创建该文件时,我在前面用 UTF-8 标记保存了它。将文件重新创建为纯文本解决了这个问题。
答案1
我猜这是期望的结果:
H:\>for /F %p in (temp.txt) do echo Testing %p
H:\>echo Testing temp1
Testing temp1
H:\>echo Testing temp2
Testing temp2
H:\>echo Testing temp3
Testing temp3
如果是这样,您是否测试过其他批处理文件,或者是否重定向了输入/输出?如果您将此作为大型项目的一部分来执行,您是否可能已将分隔符或跳过参数更改为 FOR 命令?您的 temp.txt 文件前面是否有不可打印的字符?我已经让它在几台不同的计算机上运行,包括一台 2k3 Server Std. box...我不禁想到您的输入文件有问题,或者在您不知情的情况下设置了默认值。
答案2
不要使用 进行测试echo
,它只是按原样获取集合中的名称(即使文件不存在),请尝试类似以下操作type
:
for %p in (temp.txt) do type %p
这将向您显示 shell“看到”的内容。(请注意,使用不存在的文件时,/F 会抱怨找不到该文件,但也许您周围有多个 temp.txt?)
答案3
正确的做法是这样的:
for %%a in (temp1 temp2 temp3) do (
echo Testing %%a
for /f %%b in (%%a) do echo %%b
)
或者你可以这样做:
for /l %%n in (1,1,3) do (
for %%a in (temp%%n) do (
echo Testing %%a
for /f %%b in (%%a) do echo %%b
)
)
另一种变体是:
for %%a in (*.txt) do (
echo Testing %%a
for /f %%b in (%%a) do echo %%b
)
ETC...
如果文件名中有空格,则必须使用“usebackq”和“FOR/F”,并将文件名括在双引号中,如下所示:
...
for /f "usebackq" %%b in ("%%a") do echo %%b
...
答案4
我花了好几个小时才搞定这个问题。你需要用“type temp.txt”替换 temp.txt:
for /F %p in ('type temp.txt') do echo Testing %p