Windows批处理:使用FOR /F执行命令——“找不到命令”

7

我在Windows 7 Ultimate上执行FOR命令时遇到问题,无法执行其他命令。 该FOR命令是批处理文件的一部分,应解析另一个命令的输出。

通常情况下,如下所示:

for /f %%a IN ('tasklist') DO echo %%a

应该执行命令"Tasklist",并通过echo输出其结果。但我总是得到“找不到命令”的提示。

我尝试在for循环之外执行该命令,它可以正常工作。我还尝试在for循环中执行许多外部命令,但每个命令都会显示“找不到命令”的提示。

我还尝试了这篇文章中的示例:

Batch: Execute command with quotes in for loop with piping to find

我确定:

  • 命令存在
  • 我有读取和执行权限
  • 我的用户在管理员组中
  • 我使用“以管理员身份运行”来运行命令

但在这台电脑上没有任何命令可以正常工作。相同的命令在另一台运行Windows 7 Ultimate的电脑上可以正常工作。

那么,有人知道在所有命令都无法找到的电脑上出了什么问题吗?

以下是当我使用“ls”命令时控制台输出的示例。ls.exe是gun4win项目的可执行文件,位于与我的批处理文件运行的相同文件夹中。Windows是德语版,因此错误输出也是德语。

C:\ test>test_for.bat

C:\test>rem --- test a command stand-alone ---   

C:\test>ls 
ls.exe        test_for.bat     

C:\test>rem --- test same command in a FOR-Loop ---   

C:\test>for /F "delims=" %a in ('ls') do echo FOR-OUTPUT: %a 
Der Befehl "ls" ist entweder falsch geschrieben oder konnte nicht gefunden
werden.

最终编辑: 问题出在系统环境变量ComSpec的值不正确。

我在高级系统设置->高级->环境变量->系统变量中将ComSpec更改为"C:\Windows\system32\cmd.exe",问题得以解决。

感谢@foxidrive和@jeb的帮助。


3
你的脚本是否使用了名为 path 的变量? - foxidrive
2
你可以尝试在 %SystemRoot%\System32\ 目录下执行脚本,因为 tasklist 命令就在那里,或者尝试添加路径到 pathpathext 环境变量中。 - aschipfl
1
@JosefZ “命令未找到”似乎不是标准的Windows cmd错误消息。 <-- 很好的观点Josef。这不是cmd错误消息。 - foxidrive
1
如果错误信息被引用错误,那么 comspec 变量也可能出错,如果脚本内运行的命令只在 for 命令中失败,则 comspec 会用于为 for 中的每个命令调用 cmd.exe。 - foxidrive
1
如上所述,更改ComSpec将被缓存。请在“高级系统设置->高级->环境变量->系统变量”下检查/修改您的ComSpec设置。 - jeb
显示剩余8条评论
1个回答

5
如果您使用 FOR /F 并且对于每个程序(包括内部命令)都收到错误消息 'something' is not recognized as an internal or external command, operable program or batch file,则最常见的原因是 ComSpec 变量设置错误。
您可以使用 set ComSpec 命令检查变量值,它应该是 C:\Windows\System32\cmd.exe
在命令行上更改变量值是无效的,问题的原因在于 DosTips: ComSpec strange behaviour 中有描述。
如果变量包含不同的值,则应进行以下更正:
对于德语系统: Erweiterte Systemeigenschaften->Erweitert->Umgebungsvariaben->Systemvariablen 对于英语系统: Win Key+Pause Key->Advanced System Settings->Environment Variables->System Variables 出现奇怪的 FOR /F 行为的第二种可能原因 如果可以在注册表中启用 AutoRun 功能 ...\Command Processor\AutoRun,请参阅 cmd /? 以获取更多详细信息。 AutoRun 功能可以在每次启动新的 cmd.exe 实例时启动批处理文件。 这可以用于显示一些数据或始终更改为所选目录等用途。 但是,在 FOR /F 中也将执行此批处理,并且通常会导致意外结果。 管道也会启动新的 cmd 实例,但会抑制 AutoRun 脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接