windowsbatch-file

Pausing a batch file when double-clicked but not when run from a console window?


Is there a way for a batch file (in this case, running on Windows XP) to determine whether it was launched from a command line (i.e. inside a console window) or launched via the shell (e.g. by double-clicking)?

I have a script which I'd like to have pause at certain points when run via the shell, but not when run at a command line. I've seen a similar question on SO, but am unable to use the same solution for two reasons: first, whether or not it pauses needs to be dependent on multiple factors, only one of which is whether it was double-clicked. Second, I'll be distributing this script to others on my team and I can't realistically ask all of them to make registry changes which will affect all scripts.

Is this possible?


Solution

  • Found one :-) – After desperately thinking of what cmd might do when run interactively but not when launching a batch file directly ... I finally found one.

    The pseudo-variable %cmdcmdline% contains the command line that was used to launch cmd. In case cmd was started normally this contains something akin to the following:

    "C:\Windows\System32\cmd.exe"
    

    However, when launching a batch file it looks like this:

    cmd /c ""C:\Users\Me\test.cmd" "
    

    Small demo:

    @echo off
    for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set DOUBLECLICKED=1
    if defined DOUBLECLICKED pause
    

    This way of checking might not be the most robust, though, but /c should only be present as an argument if a batch file was launched directly.

    Works on my machine

    Tested here on Windows 7 x64. It may or may not work, break, do something weird, eat children (might be a good thing) or bite you in the nose.