Single instance batch file?

batch-file, single-instance, windows

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.

Problem

``` :: 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?

Original source