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