2009-12-16 35 views
10

Làm cách nào bạn kiểm tra xem dịch vụ WIN32 có tồn tại không và nếu có, hãy thực hiện một số thao tác?Nếu Điều kiện tồn tại của dịch vụ

+0

dịch vụ gì vào hệ thống? Vui lòng cung cấp thêm ngữ cảnh. –

+0

Nó sẽ là một dịch vụ địa phương cho phép nói tên ABC. Tôi cần phải khởi động lại dịch vụ nếu nó tồn tại như một phần của sự kiện xây dựng bài đăng trong studio trực quan. Các sự kiện xây dựng bài đăng VS về cơ bản là các lệnh batch/dos (??). – Burt

Trả lời

10

Tắt đầu của tôi, bạn có thể kiểm tra xem một dịch vụ cụ thể có đang hoạt động hay không, như đã đề cập bởi bmargulies, sử dụng lệnh "net", đưa kết quả vào "tìm". Một số thông tin như sau sẽ kiểm tra xem một dịch vụ có đang chạy hay không, và nếu có thì dừng lại. Sau đó bạn có thể bắt đầu nó mà không cần lo lắng về việc nếu nó đã chạy hay không:

net start | find "SomeService" 
if ERRORLEVEL 1 net stop "SomeService" 
net start "SomeService" 

Nếu bạn đang sử dụng findstr để thực hiện tìm kiếm, như một số các câu trả lời khác đã gợi ý, sau đó bạn sẽ kiểm tra ERRORLEVEL bằng 0 (zero) ... nếu nó được sau đó bạn đã tìm thấy chuỗi bạn đang tìm kiếm:

net start | findstr "SomeService" 
if ERRORLEVEL 0 net stop "SomeService" 
net start "SomeService" 

về cơ bản hầu hết các hệ điều hành DOS lệnh sẽ thiết lập ERRORLEVEL, cho phép bạn kiểm tra xem một cái gì đó giống như một phát hiện đã thành công.

18

Bạn không thể làm điều này trong DOS, vì DOS không phải là Windows và thậm chí không có khái niệm về "dịch vụ".

Trong một lô của Windows nộp bạn có thể sử dụng lệnh sc để tìm các dịch vụ:

sc query | findstr SERVICE_NAME 

này sẽ liệt kê tất cả các dịch vụ và mang tên của mình.

Bạn có thể tìm kiếm một dịch vụ cụ thể với

sc query | findstr /C:"SERVICE_NAME: myservice" 

Hãy nhớ rằng tìm kiếm này là trường hợp nhạy cảm. Bạn có thể thêm công tắc /I vào findstr để tránh điều đó.

1

Làm thế nào về việc sử dụng WMIC:

danh sách đầu tiên tất cả các quy trình, sau đó grep tên quá trình của bạn. Không có kết quả nào được in nếu nó không tồn tại.

wmic service |findstr "ProcessName" 

Ví dụ:

C:\>wmic service |findstr "Search" 
FALSE  TRUE  Windows Search 
+0

làm thế nào mà sẽ làm việc trong một tuyên bố nếu? – Burt

+0

@Burt: nếu tuyên bố bằng ngôn ngữ nào? hàng loạt, vbscript, C# hoặc thậm chí perl? Chắc chắn nó sẽ dễ dàng hơn nhiều nếu bạn cài đặt wc (một phần của coreutils trong gnu32), bạn sẽ làm c:> wmic service | findstr "Tìm kiếm" | wc -l, sau đó viết một số mã để lấy số đó để xác định. –

4

Chỉ cần một phụ lục cho câu trả lời chấp nhận. Nếu bạn đang tìm cách làm những việc khác ngoài việc khởi động lại dịch vụ và đang tìm cách xem dịch vụ đã được cài đặt chưa.

sc query state= all | findstr /C:"SERVICE_NAME: MyService" 
if ERRORLEVEL 0 (**My Operation**) 

Trong trường hợp này, tình trạng = tất cả rất quan trọng vì nếu dịch vụ không bắt đầu, nó sẽ được hiểu là không được cài đặt, đó là hai việc riêng biệt.

+0

Như đã đề cập, điều này phải là: 'if not ERRORLEVEL 1 (** My Operation **)' – bstoney

3

Không nên kiểm tra thành công: "if (not) errorlevel 1" ??

Trong cửa sổ shell "nếu errorlevel #" có nghĩa là errorlevel là # hoặc cao hơn, vì vậy "nếu errorlevel 0" là đúng.

+0

là câu trả lời cho "làm cách nào để kiểm tra xem chạy một tệp thực thi có hoạt động được" hay không. được cài đặt hoặc chạy –

+0

Tôi đã biết, nhưng tôi không có quyền viết nhận xét vào lúc này. – user2956477

2

Tôi đang sử dụng mã bên dưới:

SC QUERY | FIND "SERVICE_NAME: MyService" 
IF %ERRORLEVEL% EQU 0 NET STOP MyService 

Nếu MyService không được tìm thấy,% ERRORLEVEL% sẽ được đặt ở 1 bởi FIND, nếu không nó sẽ ở lại ở mức 0.Lệnh IF% ERRORLEVEL% EQU 0 cho phép bạn kiểm tra trường hợp cuối cùng này và tiến hành một thao tác trên dịch vụ của bạn.

IF ERRORLEVEL 0 NET STOP MyService 

sẽ không hoạt động vì nó thực hiện lệnh nếu% ERRORLEVEL% lớn hơn hoặc bằng không.

Trong Visual Studio bài xây dựng sự kiện, bạn cần phải đặt một:

EXIT 0 

ở cuối vì VS sẽ phát hiện rằng% ERRORLEVEL% = 0 và nó sẽ cho rằng sự kiện bài build đã thất bại . Sử dụng cẩn thận vì điều này sẽ ẩn tất cả các lỗi trong chuỗi lệnh của bạn.

Với thủ thuật này, bạn có thể bỏ qua lỗi và sử dụng trong bài viết của bạn xây dựng sự kiện để khởi động lại dịch vụ của bạn:

NET STOP MyService 
NET START MyService 
EXIT 0 
Các vấn đề liên quan