Уничтожение процесса в Пакете и создание отчетов об успехе

у меня есть следующий пакетный файл, который завершает программу 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 уничтожается

Помощь? errorlevel's не работает, это, кажется, отказ nul не работа.

5
задан Pascal Cuoq 13 December 2009 в 12:06
поделиться

2 ответа

Подходит для меня. по крайней мере:

> 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 перенаправляет стандартный вывод ошибок в огромное ничто. , если уровень ошибки 1 проверяет, чтобы уровень ошибки был по крайней мере 1 , который должен работать на этом этапе:

ERRORLEVEL number Указывает истинное условие, если последний запуск программы вернул код выхода, равный указанному числу или превышающий его. - помогите, если

Обычно проверка уровня ошибок с помощью if% errorlevel% == является очень плохой идеей, если вы не сравниваете с 0. Семантика кодов выхода такова, что что-либо ненулевое значение сигнализирует об ошибке. Ваше предположение здесь просто заключалось в том, что taskkill вернет 1 в случае неудачи.

Ответ, позвольте мне спросить, почему вы делаете это в бесконечном цикле? taskkill уже уничтожает все экземпляров itunes.exe . И вы работаете в замкнутом цикле без каких-либо задержек, поэтому ваши командные файлы, вероятно, потребляют одно ядро ​​ЦП во время работы.

ETA: Не обращали внимания на вашу правку: зачем фигурные скобки? Блоки в пакетных файлах разделяются круглыми скобками.

Ответ. Могу я спросить, почему вы делаете это в бесконечном цикле? taskkill уже уничтожает все экземпляров itunes.exe . И вы работаете в замкнутом цикле без каких-либо задержек, поэтому ваши командные файлы, вероятно, потребляют одно ядро ​​ЦП во время работы.

ETA: Не обращали внимания на вашу правку: зачем фигурные скобки? Блоки в пакетных файлах разделяются круглыми скобками.

Ответ. Могу я спросить, почему вы делаете это в бесконечном цикле? taskkill уже уничтожает все экземпляров itunes.exe . И вы работаете в замкнутом цикле без каких-либо задержек, поэтому ваши командные файлы, вероятно, потребляют одно ядро ​​ЦП во время своей работы.

ETA: Вы пропустили вашу правку: зачем фигурные скобки? Блоки в пакетных файлах разделяются круглыми скобками.

11
ответ дан 13 December 2019 в 19:28
поделиться

альтернативное решение, в 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"
0
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: