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>
?
你遇到了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使用临时文件来解决问题的想法是一种有效而简单的解决方案.
对于您的问题,一个非常简单的解决方案是在命令中使用文件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)
归档时间: |
|
查看次数: |
341 次 |
最近记录: |