如何在FOR命令中指定/ D?

时间:2016-03-14 15:33:12

标签: batch-file cmd

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>执行命令?

3 个答案:

答案 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本身的行为有点奇怪。