我正在使用 Windows 命令行脚本。我想做的是执行由另一个命令“B”生成的命令“A”作为其输出,我还可能想在执行之前先检查该命令是否存在。这里有人知道怎么做吗?提前致谢!
3 回答
a.exe > tmp.cmd
CALL tmp.cmd
经典方法是按照Eugen Rieck 的建议将输出重定向到脚本文件。可以通过写入临时文件夹并在完成后删除临时脚本来完善它。我在临时脚本名称中加入了一个随机数,以降低脚本的两个同时实例不会相互干扰的可能性。
@echo off
setlocal
set script="%temp%\temp%random%.bat"
commandA >%script%
call %script%
del %script%
您的 commandA 可能不会产生任何输出。执行空脚本不会导致任何错误。但是,如果您愿意,可以通过以下方式检测到脚本为空:
for %%A in (%script%) do if %%~zA equ 0 echo The script is empty.
可以使用多个命令构建脚本:
commandA >%script%
commandB >>%script%
commandC >>%script%
或更有效地:
>%script% (
commandA
commandB
commandC
)
一种非经典的方法是将命令存储在变量而不是脚本文件中,然后将扩展值作为宏执行。宏的执行可能比脚本的执行快得多,因为它都是基于内存的。但是,成功构建功能宏的规则比构建脚本要复杂得多。此外,宏被限制为最多 8191 个字符(字节) - 批处理环境变量的最大长度。
甚至可以创建一个接受参数和返回值的宏!
在 DOSTips 站点上,已经对批处理宏进行了大量的工作。如果您有兴趣尝试一下,这里有两个重要的参考资料:
http://www.dostips.com/forum/viewtopic.php?p=7330 一个很好的起点,展示了概念的发展,以及许多关键组件
http://www.dostips.com/forum/viewtopic.php?p=11344最新和最伟大的带有参数的宏的语法得到了很大改进
在大多数情况下应该有效的简单方法是:
for /F "tokens=*" %%i in ('a.exe') do %%i
或者
for /F "tokens=*" %%i in ('a.exe') do if "%%i" NEQ "" %%i