2009-12-13 5 views
5

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

ответ

11

Работы для меня, по крайней мере:

> 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, которые должны работать в этой точке:

ERRORLEVEL номер Определяет истинное состояние, если последний запуск программы возвращается код выхода, равный или больше, чем количество указанного. - help if

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

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

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

+0

'почему на затылке фигурные скобки', ну, я использую их, пока я работал с ними. Я не знаю; Мне просто нравится. Это выглядит лучше, я думаю. –

+2

Ну, если вы используете их в пакетных файлах, то ожидайте, что все будет не так. Если вы пишете код на языке, вы должны использовать грамматику языка, независимо от того, что выглядит лучше или нет. Кудрявые скобки не работают как разделители блоков в партии. – Joey

+0

Я думал, что они сделали. По крайней мере, они работали для кодов, которые я использовал. Я работаю с партией более 1 года и развился с фигурными фигурными скобками, снова и снова, и он отлично работает. Мои клиенты (ака youtubers;)) говорят, что это отлично работает для них. –

0

альтернативное решение, в 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

Почему вы не используете PowerShell?

try 
{ 
    Stop-Process -Name itunes -ErrorAction Stop 
    "iTunes is killed" 
} 
catch 
{ 
    "iTunes not found" 
}