简体   繁体   中英

How do I detect if script was CALL'ed or invoked directly, in Windows CMD.EXE shell?

I need to distinguish these two situations inside script.cmd:

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

How can I determine if my script.cmd was invoked directly, or invoked in the context of using a CALL?

If it matters, this is on 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.

Anyone know the "magic goes here" which would detect having been CALL'ed and set invoked=1?

At this moment, I see no way to detect it, but as a workaround you can always force the use of the sentinel.

@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_ %*

This will allow you to use the indicated syntax

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

The posted code ends the script with a random exit code for testing. Execution will continue when the exit code is 0

NOTE: For it to work, at least in XP, it seems the call to the batch file MUST be the last code in the batch file

Check if the script's path is in the CMDCMDLINE variable. If not, then it was probably called.

In this example I use %CMDCMDLINE:"=/% to turn the quotes into forward-slashes (the FIND command can't search for quotes) and I echo it with <NUL SET/P="" so that certain characters in the file path (like ampersands) don't break the script.

<NUL SET/P="%CMDCMDLINE:"=/%" | FIND "/%~0/">NUL || (
    REM Commands to perform if script was called
    GOTO:EOF
)

::AND/OR

<NUL SET/P="%CMDCMDLINE:"=/%" | FIND "/%~0/">NUL && (
    REM Commands to perform if script was NOT called
    GOTO:EOF
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM