为什么不需要`call`从pipe道中涉及的被调用的批处理脚本返回?

假设有一个batch file调用者)执行另一个batch file(被调用者), call命令需要被使用以在被调用者完成执行之后返callback用者。 这里是一个例子:

caller.bat

 echo Calling another script... call callee.bat echo Returned from callee... 

callee.bat (在相同的位置)

 echo Being called from caller... 

输出将是这个(省略命令回声),显示执行返回按预期:

 Calling another script... Being called from caller... Returned from callee... 

如果call者中的call命令被解除,则输出将是:

 Calling another script... Being called from caller... 

但是只要被调用者涉及到pipe道( | ), call命令是否被使用就没有区别。 例如:

caller.bat (被调用者保持不变)

 echo Calling another script... break | callee.bat echo Returned from callee... 

输出将是这个,虽然没有call命令。

 Calling another script... Being called from caller... Returned from callee... 

这是什么原因导致执行返回给调用者?

Solutions Collecting From Web of "为什么不需要`call`从pipe道中涉及的被调用的批处理脚本返回?"

两种方法可以从调用者( 文件)调用另一个批处理文件: call callee.batcmd /C callee.bat ; 不同的是call在调用者程序的相同上下文中执行另一个批处理文件,所以它们共享相同的环境变量和另一个状态,而cmd /C在完全分离的上下文中执行另一个批处理文件。 就像个人笔记一样,我用内部子程序来调用通过call调用的批处理文件,而通过cmd /C调用外部子程序 (并直接调用批处理文件而不call或者cmd /C ,这会继承行为和上下文的调用者批处理文件)。

在执行管道时,管道的两边都是通过cmd /C执行的,所以双方都作为外部子程序调用。 这样,如果管道的任何一边是一个Batch.BAT文件,它将在结束时返回到调用者程序。

放在for /F命令中的被调用的批处理文件中会出现相同的行为,并且出于同样的原因也可能存在这种行为。 for /F %%a in ('calle.bat') do ...