Windows命令行解释器具有FOR命令,该命令能够解析给定命令的输出并为输出的每一行执行循环,例如:
FOR /F %%i IN ('DIR .') DO echo %i # Outputs each file name
命令(DIR .
)通过cmd /C <command> <command-arguments>
在子命令行中执行,但是,未指定/D
参数...如果用户有这种情况会导致奇怪的行为带输出的AutoRun命令(例如echo或cls)。
有没有办法强制FOR通过cmd /C /D <command> <command-arguments>
执行命令?
答案 0 :(得分:6)
你遇到了cmd.exe的许多设计缺陷之一,这个问题困扰了我很长一段时间。我很确定FOR / F执行命令时无法抑制AutoRun。
这使得特别恼人的是管道也使用CMD / C(管道的每一侧都有一个),但管道的设计者足够聪明,可以同时包含/ D和/ S选项。 FOR / F的设计师无法做到这一点真的很遗憾。
我相信你唯一的追索权一个选择就是在你的AutoRun命令定义中采取防御措施。我建议将所有AutoRun命令放在一个批处理脚本中,其中包含以下内容:
@echo off
if defined AutoRunComplete exit /b
set AutoRunComplete=1
REM Put your AutoRun commands below...
但如果你无法控制AutoRun命令,那么我认为你运气不好。 Aacini's idea of using a temporary file to get around the problem是一个有效而简单的解决方案。
答案 1 :(得分:4)
针对您的问题的一个非常简单的解决方案是使用for /F
命令中的文件而不是命令。这样,我们只是通过命令模拟for /F
的内部操作,但显式执行每个步骤: 1. 执行命令并将其输出存储在临时文本文件中。 2. 处理临时文件中的所有行。 3。删除文件。
DIR . > TempFile.txt
FOR /F %%i IN (TempFile.txt) DO echo %%i
DEL TempFile.txt
答案 2 :(得分:2)
如果有许多FOR / F块用于解析程序输出,那么添加cmd.exe包装器会很有用。
这个包装器可以安装和
set "comspec=C:\somewhere\cmdWrapper.exe"
FOR /F %%i IN ('DIR .') DO echo %%i
包装器本身必须使用/D /C
启动原始cmd.exe。
但是comspec variable本身的行为有点奇怪。