у меня есть следующий пакетный файл, который завершает программу 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
не работа.
Подходит для меня. по крайней мере:
> 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: Вы пропустили вашу правку: зачем фигурные скобки? Блоки в пакетных файлах разделяются круглыми скобками.
альтернативное решение, в 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"