2013-03-16 44 views
24

Tôi muốn một chương trình theo lô, chương trình này sẽ kiểm tra xem quá trình notepad.exe có tồn tại hay không.Chương trình hàng loạt để kiểm tra xem quy trình có tồn tại không

nếunotepad.exe tồn tại, nó sẽ kết thúc quá trình,

khác chương trình batch sẽ tự đóng.

Đây là những gì tôi đã thực hiện:

@echo off 
tasklist /fi "imagename eq notepad.exe" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe" 
exit 

Nhưng nó không hoạt động. Có gì sai trong mã của tôi?

+1

Tại sao bạn không gọi 'taskkill' mà không xác minh xem tác vụ có tồn tại không? –

+2

'taskkill' không thay đổi errorlevel cho tôi ... – user2033427

+0

@Andriy M Tôi muốn kiểm tra xem quá trình có tồn tại không. sau đó kết thúc quá trình hoặc đóng chính nó. – user2176930

Trả lời

41

TASKLIST không đặt errorlevel.

echo off 
tasklist /fi "imagename eq notepad.exe" |find ":" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe" 
exit 

nên thực hiện công việc, vì ":" sẽ xuất hiện trong TASKLIST đầu ra chỉ khi nhiệm vụ là không tìm thấy, vì thế FIND sẽ thiết lập errorlevel để 0 cho not found1 cho found

Tuy nhiên,

taskkill/f/im "notepad.exe"

sẽ giết nhiệm vụ notepad nếu nó tồn tại - không thể làm gì nếu không có sổ ghi chú công việc tồn tại, vì vậy bạn không thực sự cần phải thử nghiệm - trừ khi có điều gì đó khác mà bạn muốn thực hiện ... như có lẽ

echo off 
tasklist /fi "imagename eq notepad.exe" |find ":" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe"&exit 

sẽ xuất hiện khi bạn yêu cầu - giết quá trình notepad nếu nó tồn tại, sau đó thoát - nếu không tiếp tục với lô

+4

Thay vì kiểm tra 'if errorlevel', điều này có thể đơn giản hơn nữa với [thực thi có điều kiện] (http://www.robvanderwoude.com/condexec.php). – rojo

+2

Có lẽ tốt hơn là 'tìm' notepad.exe ''vì đầu ra được dịch và chúng tôi không thể chắc chắn liệu': 'có xuất hiện ở tất cả các ngôn ngữ hay không. –

8

TASKLIST không đặt mã thoát mà bạn có thể kiểm tra trong tệp lô. Một giải pháp thay thế để kiểm tra mã thoát có thể phân tích cú pháp đầu ra tiêu chuẩn của nó (mà hiện tại bạn đang chuyển hướng đến NUL). Rõ ràng, nếu quá trình được tìm thấy, TASKLIST cũng sẽ hiển thị chi tiết của nó, bao gồm cả tên hình ảnh. Do đó, bạn chỉ có thể sử dụng FIND hoặc FINDSTR để kiểm tra xem đầu ra của TASKLIST có chứa tên bạn đã chỉ định trong yêu cầu hay không. Cả hai FINDFINDSTR đặt mã thoát không trống nếu tìm kiếm không thành công. Vì vậy, điều này sẽ hoạt động:

@echo off 
tasklist /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul 
if not errorlevel 1 (taskkill /f /im "notepad.exe") else (
    specific commands to perform if the process was not found 
) 
exit 

Ngoài ra còn có một thay thế không liên quan đến TASKLIST. Không giống như TASKLIST, TASKKILL không đặt mã thoát. Đặc biệt, nếu nó không thể chấm dứt một tiến trình vì nó không tồn tại, nó sẽ thiết lập mã thoát 128. Bạn có thể kiểm tra mã đó để thực hiện các hành động cụ thể mà bạn có thể cần thực hiện trong trường hợp quy trình được chỉ định không tồn tại:

@echo off 
taskkill /f /im "notepad.exe" > nul 
if errorlevel 128 (
    specific commands to perform if the process was not terminated because it was not found 
) 
exit 
+0

Tôi tìm thấy nếu tên hình ảnh, bao gồm phần mở rộng tệp, hơn 25 ký tự, cột "Tên hình ảnh" trong đầu ra của danh sách nhiệm vụ sẽ bị cắt bớt, điều này khiến lệnh "tìm" bằng tên hình ảnh không hoạt động. Tuy nhiên, chỉ phát hiện bằng ký tự ":" có vẻ quá lỏng lẻo, tôi sợ nó có thể xảy ra ở đầu ra dương của các phiên bản sau. Có cách nào khác tốt hơn để làm như vậy không? – Elliott

+1

@Elliott: Nếu bạn lưu trữ tên của tệp thi hành trong một biến, bạn có thể sử dụng toàn bộ giá trị trong 'tasklist' và chỉ 25 ký tự đầu tiên trong' find': 'tasklist/fi" imagename eq% imgname% "| tìm/i "% imgname: ~ 0,25%"> nul' –

+0

Cảm ơn rất nhiều! :) – Elliott

-3

Hãy thử điều này:

@echo off 
set run= 
tasklist /fi "imagename eq notepad.exe" | find ":" > nul 
if errorlevel 1 set run=yes 
if "%run%"=="yes" echo notepad is running 
if "%run%"=="" echo notepad is not running 
pause 
11

Đây là một giải pháp một dòng.

Nó sẽ chạy taskkill chỉ khi quá trình này thực sự chạy nếu không nó sẽ chỉ thông báo rằng nó không chạy.

tasklist | find /i "notepad.exe" && taskkill /im notepad.exe /F || echo process "notepad.exe" not running. 

này được đầu ra trong trường hợp quá trình này đã chạy:

notepad.exe   1960 Console     0 112,260 K 
SUCCESS: The process "notepad.exe" with PID 1960 has been terminated. 

Đây là sản phẩm trong trường hợp không chạy:

process "notepad.exe" not running. 
+0

không hoạt động với tôi –

+1

đối với tôi, nó hoạt động trong Windows 10, tôi sử dụng nó trong một số tập lệnh. – nicovota

+0

có lẽ tôi đã bỏ lỡ điều gì đó –

-1

Đó là lý do tại sao nó không làm việc vì bạn mã hóa một cái gì đó điều đó không đúng, đó là lý do tại sao nó luôn luôn thoát và script executer sẽ đọc nó như là file batch không thể hoạt động để ngăn chặn nó thoát ra và dừng lại vì vậy nó phải là

tasklist /fi "IMAGENAME eq Notepad.exe" 2>NUL | find /I /N "Notepad.exe">NUL 
if "%ERRORLEVEL%"=="0" (
msg * Program is running 
goto Exit 
) 
else if "%ERRORLEVEL%"=="1" (
msg * Program is not running 
goto Exit 
) 

hơn

@echo off 
tasklist /fi "imagename eq notepad.exe" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe" 
exit 
0
QPROCESS "myprocess.exe">NUL 
IF %ERRORLEVEL% EQU 0 ECHO "Process running" 

Đoạn mã trên đã được thử nghiệm trong Windows 7, với một người dùng với rigths quản trị viên.

Các vấn đề liên quan