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

asc*_*pfl 6 windows cmd pipe batch-file call

假设存在执行另一个批处理文件(被调用者)的批处理文件(调用者),则call需要使用该命令以便在被调用者完成执行后返回调用者.这是一个例子:

caller.bat:

echo Calling another script...
call callee.bat
echo Returned from callee...
Run Code Online (Sandbox Code Playgroud)

callee.bat(在同一地点):

echo   Being called from caller...
Run Code Online (Sandbox Code Playgroud)

输出将是这个(省略命令echos),表明执行按预期返回:

Calling another script...
  Being called from caller...
Returned from callee...
Run Code Online (Sandbox Code Playgroud)

如果call命令在调用者中被解除,则输出将为:

Calling another script...
  Being called from caller...
Run Code Online (Sandbox Code Playgroud)

但是一旦被调用者涉及管道(|),则call命令是否被使用没有区别.例如:

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

echo Calling another script...
break | callee.bat
echo Returned from callee...
Run Code Online (Sandbox Code Playgroud)

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

Calling another script...
  Being called from caller...
Returned from callee...
Run Code Online (Sandbox Code Playgroud)

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

Aac*_*ini 6

两种方法可以从调用者调用另一个批处理文件(文件):call callee.batcmd /C callee.bat; 不同之处在于,在调用者程序的相同上下文call执行另一个Batch文件,因此它们共享相同的环境变量和另一个状态,而在完全分离的上下文中执行另一个Batch文件.正如我个人而言,我用来命名内部子程序通过调用批处理文件,以及外部子程序的一个通过调用(和覆盖批处理文件中直接引用不也,是继承行为和呼叫者批处理文件的情况下).cmd /Ccallcmd /Ccallcmd /C

在执行管道时,管道的两侧都是通过a执行的cmd /C,因此两侧都被调用为外部子程序.这样,如果管道的任何一侧是Batch.BAT文件,它在结束时返回到调用者程序.

放置在for /F命令中的被调用者批处理文件中会发生相同的行为,并且由于同样的原因而异常;for /F %%a in ('calle.bat') do ...