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

时间:2015-04-16 13:14:57

标签: windows cmd

我需要在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.

任何人都知道"魔法来到这里"哪个会检测到已被CALL' ed并设置为invoked = 1?

1 个答案:

答案 0 :(得分: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似乎必须是批处理文件中的最后一个代码