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

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

5
一个非常简单的解决方法是使用一个中间文件,而不是直接使用命令:DIR . > DIR.txt & FOR /F %%i IN (DIR.txt) DO echo %%i - Aacini
3个回答

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的想法是使用临时文件来解决问题,这是一种有效而简单的解决方案。


感谢您的评论-不幸的是,我无法控制AutoRun文件,该问题发生在客户现场,我们想确保将来不会再次遇到相同的情况。您是否知道有关此问题的任何MS Connect问题讨论? - D.R.
3
@D.R. - 我能找到的最好的是在https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433。 - dbenham

4
你的问题有一个非常简单的解决方案,就是使用 for /F 命令中的 文件 而不是命令。这样,我们就可以模拟 for /F 命令内部的操作,但需要明确地执行每个步骤:1. 执行命令并将其输出存储在一个临时文本文件中。 2. 处理临时文件中的所有行。 3. 删除该文件。
DIR . > TempFile.txt
FOR /F %%i IN (TempFile.txt) DO echo %%i
DEL TempFile.txt

2
很棒的想法,而且实现起来简单。 - dbenham

2

如果您有许多用于解析程序输出的FOR /F块,则添加cmd.exe包装器可能会很有用。

可以使用此包装器安装

set "comspec=C:\somewhere\cmdWrapper.exe"
FOR /F %%i IN ('DIR .') DO echo %%i

包装器本身必须使用/D /C启动原始的cmd.exe。

但是,comspec变量本身的行为有点奇怪。


另一个有趣的想法。我觉得你可以使用CSCRIPT实现包装器。但是,cmd FOR / F缓存COMSPEC值的“奇怪”行为使该技术不可靠。我不知道如何控制你的脚本是否是第一个使用FOR / F的运行。 - dbenham
我已经尝试过CSRIPT,但它失败了,因为它不接受“/C”选项。目前我正在尝试使用.hta文件来运行mshta,但我无法让它工作,因为似乎只有.exe文件才能在comspec中有效,而不是文件关联。 - jeb

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