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

D.R*_*.R. 9 cmd batch-file

Windows命令行解释器具有FOR命令,该命令能够解析给定命令的输出并为输出的每一行执行循环,例如:

FOR /F %%i IN ('DIR .') DO echo %i # Outputs each file name
Run Code Online (Sandbox Code Playgroud)

命令(DIR .)在子命令行中执行cmd /C <command> <command-arguments>,但是,/D未指定参数...如果用户具有带输出的AutoRun命令(例如echo或cls),则会导致奇怪的行为.

有没有办法强制FOR执行命令cmd /C /D <command> <command-arguments>

dbe*_*ham 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...
Run Code Online (Sandbox Code Playgroud)

但是如果你无法控制AutoRun命令,那么我认为你运气不好. Aacini使用临时文件来解决问题的想法是一种有效而简单的解决方案.

  • @DR - 我能找到的最好的是https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433 (3认同)

Aac*_*ini 4

对于您的问题,一个非常简单的解决方案是在命令中使用文件for /F而不是命令。这样,我们只是模拟for /F命令的内部操作,但显式执行每个步骤:1.执行命令并将其输出存储在临时文本文件中。2.处理临时文件中的所有行。3.删除文件。

DIR . > TempFile.txt
FOR /F %%i IN (TempFile.txt) DO echo %%i
DEL TempFile.txt
Run Code Online (Sandbox Code Playgroud)

  • 很棒的想法,而且实施起来很简单。 (2认同)