我想打印控制台输出并同时获取。 我尝试使用下面的代码来获取和打印结果,但它不起作用。 我怎么能这样做?
代码:
set myvar="C:\Program Files (x86)\Inno Setup 5\iscc.exe" asd.iss /SSign_PATH="%cd%\DigitalSign\signtool.exe sign $p"
for /f "delims=" %%i in ('%myvar%') DO (
echo %%i
set OUTPATH=%%i )
结果:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
答案 0 :(得分:0)
您的错误消息来自FOR / F命令。
解决方案:对FOR / F声明的小改动
for /f "delims=" %%i in ('^"%myvar%^"') DO (
<强>解释强>
通过FOR /F .... IN ('command') DO ...
之类的命令执行命令时,命令在新的cmd.exe进程中通过如下命令执行:
C:\Windows\system32\cmd.exe /c command
由于空格,您的命令需要在可执行路径周围引用。所以你的命令,如目前所写,变成:
C:\Windows\system32\cmd.exe /c "C:\Program Files (x86)\Inno Setup 5\iscc.exe" asd.iss /SSign_PATH="%cd%\DigitalSign\signtool.exe sign $p"
但CMD.EXE有一个不幸的设计,如果命令的第一个字符是引号,那么它通常会在执行命令字符串之前删除最外面的引号。所以命令变为
C:\Program Files (x86)\Inno Setup 5\iscc.exe" asd.iss /SSign_PATH="%cd%\DigitalSign\signtool.exe sign $p
查看上述内容,您应该能够了解收到错误消息的原因。
解决方案是在整个命令周围添加一组额外的引号,这些引号将被剥离。您希望命令看起来像:
C:\Windows\system32\cmd.exe /c ""C:\Program Files (x86)\Inno Setup 5\iscc.exe" asd.iss /SSign_PATH="%cd%\DigitalSign\signtool.exe sign $p""
但是你不想要额外的引号来抛弃批处理解析器,因此它们应该在IN()
子句中进行转义。