This page is edited from the 1cmdfaq.txt faq-file contained in
my tscmd.zip
command line interface (CLI) collection. That zipped file has much
additional material, including a number of detached .cmd script
files. It is recommended that you also get the zipped version as a
companion.
Please see "
The Description and
the Index page" for the conditions of usage and other such
information.
68} How can I test if a program already has been loaded?
In XP (and beyond) one can use Task Manager for the purpose e.g. as
follows
@echo off & setlocal enableextensions
tasklist|find "firefox.exe ">nul
if %errorlevel% EQU 0 (
echo Firefox has been loaded
) else (
echo Firefox has not been loaded)
endlocal & goto :EOF
The output would be e.g.
C:\_D\TEST>cmdfaq
Firefox has been loaded
Another example, this time not relying on find. Sometimes e.g.
Firefox keeps running in the background even if this does not show on
the taskbar (a bug or a feature is beside the point here). How to
detect and delete the task?
@echo off & setlocal enableextensions
set target_=firefox.exe
set running_=false
for /f "skip=3 tokens=1" %%p in (
'tasklist /fi "USERNAME ne NT AUTHORITY\SYSTEM" ^
/fi "STATUS eq running"') do (
if "%%p"=="%target_%" set running_=true)
if "%running_%"=="true" (
taskkill /im %target_%
) else (
echo %target_% is not running)
endlocal & goto :EOF
If you want to force it apply
taskkill /f /im %target_%
If you are using a script in a command window to call an MS-DOS
program (or a script), and you wish to prevent calling that same
program simultaneously from another window/or via shelling (to avoid
datafile or whatever conflicts), you can proceed as shown below. The
script creates a lockfile for the duration of running the script.
@echo off & setlocal enableextensions
if exist "%temp%\vpp3d.mrk" (
echo Exiting: vpp3d already is running
echo If this is in error delete %temp%\vpp3d.mrk
goto :EOF)
echo Mark vpp3d>"%temp%\vpp3d.mrk"
::
:: Call whatever program it happens to be
C:\_F\VPP\VPP3D.COM
::
del "%temp%\vpp3d.mrk"
endlocal & goto :EOF
It is quite possible that there are several cmd.exe windows open and a
script or program running in one of them. Since all are labeled cmd.exe
the question arises how to test if a particular script is being run.
This is how to solve the task:
@echo off & setlocal enableextensions
set myscriptIsRrunning_=
tasklist /v|findstr /b /i /r /c:"cmd.exe.* - myscript">nul
if %errorlevel% EQU 0 set myscriptIsRunning=true
if defined myscriptIsRunning (
echo myscript is currently running
) else (
echo myscript is not currently running)
endlocal & goto :EOF