2009-12-13 15 views
5

tôi có tệp lô sau, kết thúc chương trình iTunes, nếu tôi kết nối iPod, nó sẽ không đồng bộ hóa nó. (Tôi biết bạn có thể thiết lập điều này trong iTunes.)Giết một quá trình theo lô và báo cáo thành công

@echo off 
:kill 
cls 
taskkill /F /IM itunes.exe >nul 
if %errorlevel%==1 { 
echo iTunes not found. 
} else { 
echo iTunes is killed. 
} 
goto kill 

Tuy nhiên, >nul không phản hồi lại lệnh; do đó, nó chỉ cung cấp cho văn bản lệnh mặc định. Vì vậy, yeah, những gì tôi muốn làm:

Nếu iTunes không được tìm thấy, như được đưa ra bởi các lệnh, nó sẽ hiển thị

iTunes không tìm thấy

Nếu nó được tìm thấy và chấm dứt,

iTunes bị giết

Trợ giúp? errorlevel không hoạt động, điều này dường như là lỗi của nul không hoạt động.

Trả lời

11

trình cho tôi ít nhất là:

> 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

Vì vậy taskkill trả lại một mã thoát đúng đắn. Chuyển hướng đầu ra của nó không có gì để làm với điều này. Nhưng mức độ lỗi cho thất bại là 128. Bạn thực sự nên sử dụng thành ngữ thích hợp để kiểm tra lỗi.

Ngoài ra có vẻ như taskkill đang in tới stderr để bạn thấy kết quả của nó vẫn còn khi chỉ chuyển hướng stdout. Bạn có thể xem xét việc viết lại mã ở trên để:

taskkill /F /IM itunes.exe >nul 2>&1 
if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.) 

2>&1 chuyển hướng đầu ra lỗi chuẩn thành không có gì lớn. if errorlevel 1 kiểm tra cho errorlevelít nhất 1 mà nên làm việc vào thời điểm này:

ERRORLEVEL số Chỉ định một điều kiện true nếu chương trình chạy cuối cùng đã trả về mã thoát bằng hoặc lớn hơn số lượng quy định. - help if

chung kiểm tra errorlevel với if %errorlevel%== là một ý tưởng khá xấu, trừ khi bạn đang so sánh về 0. ngữ nghĩa cho mã lối ra là rằng anything tín hiệu khác không thất bại. Giả định của bạn ở đây chỉ là taskkill sẽ trả lại 1 về lỗi.

Ans Tôi có thể vui lòng hỏi tại sao bạn làm điều này trong một vòng lặp vô tận? taskkill đã giết chết tất cả phiên bản itunes.exe. Và bạn đang chạy trong một vòng lặp chặt chẽ mà không có bất kỳ sự chậm trễ để các tập tin batch của bạn có thể tiêu thụ một lõi CPU trong khi nó đang chạy.

ETA: Đã xem bản chỉnh sửa của bạn: Tại sao lại có dấu ngoặc nhọn? Các khối trong các tập tin batch được phân định bằng dấu ngoặc tròn.

+0

'lý do tại sao trên dấu ngoặc nhọn tai, tốt, tôi sử dụng chúng miễn là tôi đã làm việc với chúng. Tôi không biết; Đơn giản là tôi thích nó. Nó trông đẹp hơn tôi đoán. –

+2

Vâng, nếu bạn đang sử dụng chúng trong các tệp theo lô, thì mọi thứ sẽ xảy ra sai. Nếu bạn viết mã bằng ngôn ngữ, bạn phải sử dụng ngữ pháp của ngôn ngữ, bất kể ngôn ngữ nào đẹp hơn hay không. Niềng răng xoăn không hoạt động như các dấu phân cách khối theo lô. – Joey

+0

tôi nghĩ rằng họ đã làm. Ít nhất họ đã làm việc cho các mã tôi sử dụng. Tôi làm việc với hàng loạt trong hơn 1 năm nay, và đã phát triển với niềng răng xoăn, hơn và hơn, và nó hoạt động tốt. Khách hàng của tôi (aka youtubers;)) nói rằng nó hoạt động tốt cho họ. –

0

một giải pháp thay thế, trong VBScript, lưu dưới mã như 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 

trên dòng lệnh

c:\test> cscript //nologo mykill.vbs "itunes.exe" 
0

Tại sao bạn không sử dụng PowerShell?

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