windowsbatch-filesingle-instance

Single instance batch file?


:: dostuff.bat
@echo off
:: insert long-running process call here
: End

What can I add to this batch file to make it terminate if it's already running in another process when it's executed?


Solution

  • Well, if there can be only exactly one instance ever, then you can probably do this by creating a dummy file somewhere, probably in the temp directory:

    copy NUL "%TEMP%\dostuff_is_doing_stuff.tmp"
    

    you then remove it after you're done:

    del "%TEMP%\dostuff_is_doing_stuff.tmp"
    

    and at the start of the batch file you can check whether that file exists and exit accordingly:

    if exist "%TEMP%\dostuff_is_doing_stuff.tmp" (
        echo DoStuff is already running. Exiting ...
        exit /b 1
    )
    

    Similarly, you can do that by changing the window title, which should also be more robust against a Ctrl+C'ed or crashed batch file.

    Set the title:

    title DoStuff
    

    Re-set it afterwards:

    title Not doing stuff
    

    Check for it:

    tasklist /FI "WINDOWTITLE eq DoStuff"
    

    However, this has one problem: When cmd runs as administrator you'll get "Administrator: DoStuff" as the title. Which doesn't match anymore with tasklist. You can hack-solve it by also checking for "Administrator: DoStuff" but that might look different depending on the Windows UI language, so it's probably not the best solution.