Пакетное завершение процесса и отчет об успешном завершении
-
19-09-2019 - |
Вопрос
у меня есть следующий пакетный файл, который завершает работу программы iTunes, так что, если я подключу свой iPod, он не будет его синхронизировать.(Я знаю, что вы можете настроить это в 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
Тем не менее, >nul
не реагирует на команду;таким образом, он просто выдает текст команды по умолчанию.Так что да, то, что я хочу сделать:
Если iTunes не найден, как указано в команде, он должен отобразить
iTunes не найден
Если он будет найден и прекращен,
iTunes убит
Помочь?уровень ошибок не работает, похоже, это ошибка nul
не работает.
Решение
По крайней мере, у меня это работает:
> 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
Итак taskkill
является возвращает правильный код выхода.Перенаправление его выходных данных не имеет к этому никакого отношения.Но уровень ошибки при сбое равен 128.Вам действительно следует использовать правильную идиому для проверки на наличие ошибок.
Также кажется, что taskkill
выполняется ли печать для stderr
таким образом, вы все еще видите его вывод, когда просто перенаправляете stdout
.Вы можете рассмотреть возможность переписывания приведенного выше кода, чтобы:
taskkill /F /IM itunes.exe >nul 2>&1
if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.)
Тот Самый 2>&1
перенаправляет вывод стандартной ошибки в огромное ничто. if errorlevel 1
проверяет наличие errorlevel
быть не менее 1 который должен сработать на данном этапе:
Номер УРОВНЯ ОШИБКИ Задает условие true, если при последнем запуске программы был возвращен код выхода, равный или превышающий указанное число.—
help if
Общая проверка errorlevel
с if %errorlevel%==
это довольно плохая идея, если только вы не сравниваете с 0.Семантика кодов выхода такова anything
ненулевой сигнал сбоя.Ваше предположение здесь как раз и заключалось в том, что taskkill
вернулся бы 1
о неудаче.
И еще, могу я любезно спросить, почему вы делаете это в бесконечном цикле? taskkill
уже убивает ВСЕ примеры itunes.exe
.И вы работаете в замкнутом цикле без каких-либо задержек, поэтому ваши пакетные файлы, вероятно, потребляют одно ядро процессора во время работы.
ETA: Пропустил вашу правку:С какой стати фигурные скобки?Блоки в пакетных файлах заключены в круглые скобки.
Другие советы
альтернативное решение, в vbscript, сохраните приведенный ниже код как mykill.vbs
Set objArgs = WScript.Arguments
strProcess = objArgs(0)
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name ='" & strProcess & "'")
If colProcesses.Count = 0 Then
Wscript.Echo strProcess & " is not running."
Else
Wscript.Echo strProcess & " is running."
'Kill the process
For Each objProcess in colProcesses
r=objProcess.Terminate()
WScript.Echo "r is " & r
If r = 0 Then
WScript.Echo strProcess & " killed"
End If
Next
End If
в командной строке
c:\test> cscript //nologo mykill.vbs "itunes.exe"
Почему бы вам не использовать PowerShell?
try
{
Stop-Process -Name itunes -ErrorAction Stop
"iTunes is killed"
}
catch
{
"iTunes not found"
}