i have the following batch file, which terminates the iTunes program so, that if i connect my iPod, it's not going to sync it. (I know you can set this up in iTunes.)
@echo off
:kill
cls
taskkill /F /IM itunes.exe >nul
if %errorlevel%==1 {
echo iTunes not found.
} else {
echo iTunes is killed.
}
goto kill
However, the >nul
does not respond to the command; so it just gives the default command text. So yeah, what i want to do:
If iTunes is not found, as given by the command, it should display
iTunes not found
If it is found and terminated,
iTunes is killed
Help? the errorlevel's don't work, this seem to be the fault of the nul
not working.
To kill the process in Windows, you can use Task Manager, Command Prompt, or Windows Powershell. By using Task Manager, select the process and hit the “End Task” button to kill the process. You can kill the process with Command Prompt by specifying PID or Image name in the “taskkill” command.
Batch file error level: %ERRORLEVEL% is an environment variable that contains the last error level or return code in the batch file – that is, the last error code of the last command executed. Error levels may be checked by using the %ERRORLEVEL% variable as follows: IF %ERRORLEVEL% NEQ 0 ( DO_Something )
It is common to use the command EXIT /B %ERRORLEVEL% at the end of the batch file to return the error codes from the batch file. EXIT /B at the end of the batch file will stop execution of a batch file.
Works for me at least:
> taskkill /f /im powershell.exe && echo worked || echo not worked SUCCESS: The process "powershell.exe" with PID 3228 has been terminated. worked > taskkill /f /im powershell.exe && echo worked || echo not worked ERROR: The process "powershell.exe" not found. not worked
So taskkill
is returning a proper exit code. The redirect of its output has nothing to do with this. But the error level for failure is 128. You really should use the proper idiom for checking for errors.
Also it seems that taskkill
is printing to stderr
so you see its output still, when just redirecting stdout
. You may consider rewriting above code to:
taskkill /F /IM itunes.exe >nul 2>&1
if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.)
The 2>&1
redirects the standard error output into the vast nothingness. if errorlevel 1
checks for errorlevel
being at least 1 which should work at this point:
ERRORLEVEL number Specifies a true condition if the last program run returned an exit code equal to or greater than the number specified. —
help if
Generally checking errorlevel
with if %errorlevel%==
is a quite bad idea, unless you're comparing to 0. The semantics for exit codes are that anything
non-zero signals failure. Your assumption here just was that taskkill
would return 1
on failure.
Ans may I kindly ask why you are doing this in an endless loop? taskkill
already kills all instances of itunes.exe
. And you're running in a tight loop without any delays so your batch files probably consumes one CPU core while it's running.
ETA: Overlooked your edit: Why on earth curly braces? Blocks in batch files are delimieted by round parentheses.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With