I have this batch to kill some process typed of course by the user and it works 5/5 when the user for example typed Calc.exe with the extension, but my issue now is to improve this batch in order to add automatically with this program if the user has omitted to add extension .exe like Calc without extension .exe will not work.
@Echo off & cls
Mode con cols=72 lines=7
Set TmpFile=TmpFile.txt
Set Resultat=KillResult.txt
If Exist %TmpFile% Del %TmpFile%
If Exist %Resultat% Del %Resultat%
::********************************************************************************************
:Main
Title Process Killer by Hackoo 2015
cls & color 0B
echo.
echo Quel(s) processus voulez-vous fermer ?
echo.
set/p "process=Entrer le(s) nom(s) de(s) processus> "
cls & color 0C
Title Killing "%process%" ...
echo.
echo Killing "%process%" ...
echo.
echo %date% *** %time% >> %TmpFile%
For %%a in (%process%) Do Call :KillProcess %%a
Cmd /U /C Type %TmpFile% > %Resultat%
Start %Resultat%
echo.
Goto :Main
::*********************************************************************************************
:KillProcess
Taskkill /IM "%~1" /F >> %TmpFile% 2>&1
echo ***************************************************************************** >> %TmpFile%
::*********************************************************************************************
So i'm focusing on this piece of code but no success !
this my little try :
:KillProcess
Set str=%~1
set str=%str:~-4%
echo.%str%
pause
if %str%==".exe" (Taskkill /IM "%~1" /F >> %TmpFile% 2>&1) || (Taskkill /IM "%~1.exe" /F >> %TmpFile% 2>&1)
So how to do that in batch ?
Thank you !
If your files have never any other extension than .exe
, you can use "%~n1.exe"
to get the filename with .exe
.
%~n1
is just the filename without extension. Than add .exe
, and put quotes around it in case the filename contains a space.
But this will fail if your executable is example.program.exe
, and the user entered example.program
. In this case the result of "%~n1.exe"
will be "example.exe"
. To avoid that, you have to check if the extension is .exe
. You can use %~x1
to get just the extension.
See also Command Line arguments (Parameters) for more information.
Just i want to share with you the hole script with a dynamic menu, perhaps it would be helpful for other people and thank you for all your contributions ;)
(Translated some french words to english)
@Echo off & cls & color 0B
Mode con cols=72 lines=10
Set TmpFile=TmpFile.txt
Set Resultat=KillResult.txt
If Exist %TmpFile% Del %TmpFile%
If Exist %Resultat% Del %Resultat%
:menuLOOP
Cls & color 0B
Title Process Starter and Killer by Hackoo 2015
echo.
echo. ==========================Menu============================
echo.
for /f "tokens=1,2,* delims=_ " %%A in ('"findstr /b /c:":menu_" "%~f0""') do echo. %%B %%C
echo.
echo. ==========================================================
set choice=
echo. & set /p choice=Make a choice or hit ENTER to quit: || GOTO :EOF
echo. & call :menu_[%choice%]
GOTO:menuLOOP
::********************************************************************************************
:menu_[1] Start a Process
cls & color 0B
echo.
Set /p "MyProcess=Enter the process name to start it> "
echo.
echo Le processus %MyProcess% est lance ...
Start %MyProcess%
GOTO :menuLOOP
::********************************************************************************************
:menu_[2] Kill a Process or Multi Processes
Title Process Killer by Hackoo 2015
cls & color 0B
echo.
echo What process do you want to kill ?
echo.
set/p "process=Enter the process name or processes names separated by a space> "
cls & color 0C
Title Killing "%process%" ...
echo.
echo Killing "%process%" ...
echo.
echo %date% *** %time% >> %TmpFile%
For %%a in (%process%) Do Call :KillMyProcess %%a
Cmd /U /C Type %TmpFile% > %Resultat%
Start %Resultat%
GOTO :menuLOOP
::*********************************************************************************************
:KillMyProcess
Taskkill /IM "%~n1.exe" /F >> %TmpFile% 2>&1
echo ***************************************************************************** >> %TmpFile%
exit /b
::*********************************************************************************************
:EOF
EXIT
EDIT 15/06/2015 : New Version : Adding Search for files using the command Where
@Echo off & cls & color 0B
Mode con cols=72 lines=11
Set TmpFile=TmpFile.txt
Set Resultat=KillResult.txt
If Exist %TmpFile% Del %TmpFile%
If Exist %Resultat% Del %Resultat%
:menuLOOP
Mode con cols=72 lines=11
Cls & color 0B
Title Process Starter and Killer by Hackoo 2015
echo(
echo( ==========================Menu============================
echo(
::Suggestion de Walid : optimisation au niveau du parseur : utiliser deux tokens au lieu de trois
for /f "tokens=2* delims=_ " %%A in ('"findstr /b /c:":menu_" "%~f0""') do echo( %%A %%B
::for /f "tokens=1,2,* delims=_ " %%A in ('"findstr /b /c:":menu_" "%~f0""') do echo( %%B %%C
echo(
echo( ==========================================================
set choice=
echo( & set /p choice=Make a choice or hit ENTER to quit: || GOTO :EOF
echo( & call :menu_[%choice%]
GOTO:menuLOOP
::********************************************************************************************
:menu_[1] Start a Process
cls & color 0B
echo(
Set /p "MyProcess=Enter the process name to start it> "
echo(
echo Le processus %MyProcess% est lance ...
Start %MyProcess%
GOTO :menuLOOP
::********************************************************************************************
:menu_[2] Kill a Process or Multi Processes
Title Process Killer by Hackoo 2015
cls & color 0B
echo(
echo What process(es) do you want to kill ?
echo(
set /p "process=Enter the process name or processes names separated by a space> "
cls & color 0C
Title Killing "%process%" ...
echo(
echo Killing "%process%" ...
echo(
echo %date% *** %time% >> %TmpFile%
For %%a in (%process%) Do Call :KillMyProcess %%a
Cmd /U /C Type %TmpFile% > %Resultat%
Start %Resultat%
GOTO :menuLOOP
::********************************************************************************************
:menu_[3] Search for files
cls & color 0A
echo(
Set /p "Location=Enter the folder location where do you want to serach> "
cls & echo(
echo You chose this location "%Location%"
echo(
Set /p "FileName=Enter the file name to looking for> "
Mode con cols=90 lines=11
Set Tmp=Tmp.txt
Set SearchResult=SearchResult.txt
echo( & cls
echo( & echo Please Wait for moment .... Searching for "%FileName%" on "%Location%"
where /r "%Location%" "%FileName%" > %Tmp%
::Pour lire la liste en Unicode (Arabe)
Cmd /U /C Type %Tmp% > %SearchResult%
Del %Tmp%
Start %SearchResult%
GOTO :menuLOOP
::*********************************************************************************************
:KillMyProcess
Taskkill /IM "%~n1.exe" /F >> %TmpFile% 2>&1
echo ***************************************************************************** >> %TmpFile%
exit /b
::*********************************************************************************************
:EOF
EXIT
Something like
:loopMain
set /p "process=Entrer le(s) nom(s) de(s) processus> "
if "%process:.exe=%"=="%process%" goto :loopMain
or
:loopMain
set /p "process=Entrer le(s) nom(s) de(s) processus> "
if /I not "%process:~-4%"==".exe" goto :loopMain
or set "process=%process%.exe"
instead of goto :loopMain
.
Similar approach in case of multiple names typed in: check an correct user's input in a simple for %%a in (%process%) do ...
loop.