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被杀死

帮助?错误级别不起作用,这似乎是不起作用的错误nul

4

3 回答 3

11

至少对我有用:

> taskkill /f /im powershell.exe && echo 工作 || 回声不起作用
成功:PID 3228 的进程“powershell.exe”已终止。
工作过

> taskkill /f /im powershell.exe && echo 工作 || 回声不起作用
错误:找不到进程“powershell.exe”。
没用

返回正确的退出代码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 number如果最后一个程序运行返回的退出代码等于或大于指定的数字,则指定一个真条件。—<code>帮助如果

通常检查errorlevelif %errorlevel%==一个非常糟糕的主意,除非您与 0 进行比较。退出代码的语义是anything非零信号失败。您在这里的假设只是失败taskkill会返回1

Ans 请问我为什么要在无限循环中这样做?已经taskkill杀死. itunes.exe而且您正在一个紧密的循环中运行,没有任何延迟,因此您的批处理文件在运行时可能会消耗一个 CPU 内核。

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

于 2009-12-13T11:50:32.540 回答
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"
于 2009-12-13T11:53:15.387 回答
0

为什么不使用 PowerShell?

try
{
    Stop-Process -Name itunes -ErrorAction Stop
    "iTunes is killed"
}
catch
{
    "iTunes not found"
}
于 2016-12-12T16:51:51.447 回答