如何在Windows CMD.EXE shell中检测脚本是否被CALL或直接调用?

我需要在script.cmd内区分这两种情况:

C:\> call script.cmd C:\> script.cmd 

我如何确定我的script.cmd是直接调用,还是在使用CALL的上下文中调用?

如果重要的话,这是在Windows 7上。

 @echo off set invoked=0 rem ---magic goes here--- if %invoked%==0 echo Script invoked directly. if %invoked%==1 echo Script invoked by a CALL. 

任何人都知道“魔法来到这里”,它会检测到已被调用并被调用= 1?

在这个时候,我看不出有什么办法来检测它,但是作为一个解决方法,你总是可以强制使用哨兵。

 @echo off setlocal enableextensions rem If "flag" is not present, use CALL command if not "%~1"=="_flag_" goto :useCall rem Discard "flag" shift /1 rem Here the main code set /a "randomExitCode=%random% %% 2" echo [%~1] exit with code %randomExitCode% exit /b %randomExitCode% goto :eof rem Retrieve a correct full reference to the current batch file :getBatchReference returnVar set "%~1=%~f0" & goto :eof rem Execute :useCall setlocal enableextensions disabledelayedexpansion call :getBatchReference _f0 endlocal & call "%_f0%" _flag_ %* 

这将允许您使用指定的语法

 script.cmd first && script.cmd second && script.cmd third 

发布的代码结束脚本与随机退出代码进行测试。 退出代码为0时,执行将继续

注:至少在XP中,它的工作,似乎call批处理文件必须是批处理文件中的最后一个代码