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