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

fdx2calv  于 2022-12-30  发布在  Windows
关注(0)|答案(2)|浏览(140)

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

mwngjboj

mwngjboj1#

目前,我看不到检测它的方法,但作为一种变通方案,您可以始终强制使用哨兵。

@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必须是批处理文件中的最后一个代码

qaxu7uf2

qaxu7uf22#

检查脚本的路径是否在CMDCMDLINE变量中。如果没有,那么它可能被调用了。
在本例中,我使用%CMDCMDLINE:"=/%将引号转换为正斜杠(FIND命令不能搜索引号),并使用<NUL SET/P=""回显它,以便文件路径中的某些字符(如“与”符号)不会破坏脚本。

<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
)

相关问题