batch-file – 具有重定向的CALL的意外功能

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

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

Redirection with & | <> also does not work as expected.

然而,那个页面和我看过的其他任何地方并没有解释它是如何工作的意外.我知道the | can do some unexpected things in general,但我不知道其他人.

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

最佳答案 我想Rob会想到这样的事情:

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%的效果,并且内容的实际扩展将在第二次运行解析器之前完成,因此&必须在调用上下文中进行解释.

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

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以某种方式使用令牌,但无法以正确的方式处理它们.

点赞