带有重定向的CALL意外功能

时间:2014-01-30 15:16:16

标签: batch-file

我遇到了一个脚本问题,所以我像往常一样去ss64.com看看我可能会找到哪些宝石来帮助我。

在查看CALL command的页面时,我遇到了这一行:

  
    

使用&重定向| <>也没有按预期工作。

  

但是,该页面以及我所看过的其他任何地方并没有解释它是如何工作的意外。我知道the | can do some unexpected things in general,但我不了解其他人。

这个意想不到的功能是什么?是否取决于您如何使用CALL命令(调用标签与脚本)?

1 个答案:

答案 0 :(得分:2)

我想罗布想到这样的事情:

call :func | more
exit /b

:func
echo line1
echo line2
exit /b

或类似

setlocal EnableDelayedExpansion
set var=Line2
( echo Line1
echo !var! ) | more

为此,可以在(你提到过)中找到解释 SO:Why does delayed expansion fail when inside a piped block of code?

但第一步中的重定向与预期的CALL(以及其他字符)一起使用

call echo Hello > output.txt

但是如果您尝试在CALL命令的第二次扩展中使用任何特殊字符,则不会执行完整命令。
关于批量解析器的CALL的特殊效果在左边描述 SO:How does the CMD.EXE parse scripts?(特别是第6阶段)

set "myCmd=echo 1 & echo 2"
call %%myCmd%%

%%具有第一次扩展导致%myCmd%的效果,并且内容的实际扩展将在第二次运行解析器之前完成,因此&必须在call上下文中进行解释。

而且这也不会产生任何结果(因为括号)

set "myCmd=echo Line1"
call (%%myCmd%%)

显然调用一个名为1.bat的批处理文件

echo echo Hello > 1.bat
set "myCmd=echo Line1 && echo Line2"
call (%%myCmd%%)
echo End

这在dostips:CALL me, or better avoid call进行了讨论 目前我认为,CALL以某种方式使用令牌,但无法以正确的方式处理它们。