Пакетное завершение процесса и отчет об успешном завершении

StackOverflow https://stackoverflow.com/questions/1896262

Вопрос

у меня есть следующий пакетный файл, который завершает работу программы 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"
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top