在批处理中杀死流程并报告成功

时间:2009-12-13 11:41:33

标签: windows batch-file cmd errorlevel

我有以下批处理文件,它终止了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无效的错误。

3 个答案:

答案 0 :(得分: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的所有个实例。并且您在没有任何延迟的情况下以紧凑的循环运行,因此批处理文件在运行时可能会消耗一个CPU内核。

ETA:忽略了你的编辑:为什么地球上的花括号?批处理文件中的块由圆括号分隔。

答案 1 :(得分: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"

答案 2 :(得分:0)

为什么不使用PowerShell?

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