2008-12-09 34 views
39

Tôi muốn có thể truy vấn xem một dịch vụ có đang chạy từ tệp lô cửa sổ hay không. Tôi biết tôi có thể sử dụng:Cách kiểm tra xem một dịch vụ có đang chạy từ dòng lệnh

sc query "ServiceName"

nhưng, điều này bãi ra một số văn bản. Những gì tôi thực sự muốn là để thiết lập biến môi trường errorlevel để tôi có thể thực hiện hành động đó.

Bạn có biết cách đơn giản để tôi có thể thực hiện việc này không?

CẬP NHẬT
Cảm ơn câu trả lời cho đến nay. Tôi lo lắng các giải pháp phân tích cú pháp văn bản có thể không hoạt động trên các hệ điều hành không phải tiếng Anh. Có ai biết một cách xung quanh này, hoặc tôi sẽ phải cắn đạn và viết một chương trình điều khiển để có được quyền này.

+0

tôi chỉ thử nghiệm trên một Trung Quốc locale Trung Quốc Ngôn ngữ của Windows máy tính xách tay 7, "truy vấn sc ..." lệnh đầu ra vẫn là tiếng Anh. – wangf

+0

Để nhận trạng thái dịch vụ dễ dàng phân tích cú pháp bằng tập lệnh bất kể ngôn ngữ hệ điều hành nào được sử dụng, tôi đã sử dụng 'WMIC Service WHERE' Name = 'SericeName' "GET Started/format: list'. Nó tạo ra 'State = Running' - dễ phân tích bằng regexp và luôn bằng tiếng Anh. –

Trả lời

63
sc query "ServiceName" | find "RUNNING" 
+1

tìm không hoạt động. công trình findstr. –

+0

@imkheong, trên hệ điều hành nào "tìm" không hoạt động? nó woks trên win7 ... –

+0

@ShaiAlon, nó đã được powershell rằng nó đã không hoạt động. Nó hoạt động trên dấu nhắc lệnh thông thường (cmd.exe). –

1

Hãy thử

sc query state= all 

cho một danh sách các dịch vụ và liệu họ có đang chạy hay không.

8

nếu bạn không nhớ kết hợp lệnh net với grep, bạn có thể sử dụng tập lệnh sau.

@echo off 
net start | grep -x "Service" 
if %ERRORLEVEL% == 2 goto trouble 
if %ERRORLEVEL% == 1 goto stopped 
if %ERRORLEVEL% == 0 goto started 
echo unknown status 
goto end 
:trouble 
echo trouble 
goto end 
:started 
echo started 
goto end 
:stopped 
echo stopped 
goto end 
:end 
+0

Tôi dường như không có grep trên hệ thống của mình. Bạn đã tải xuống từ đâu đó, nếu có, ở đâu? –

+0

http://unxutils.sourceforge.net/ –

+2

Tôi đã sử dụng một cái gì đó như thế này, nhưng với một 'tìm' thay vì một 'grep' bởi vì tôi không muốn phải dựa vào cài đặt bất cứ điều gì khác. –

1

Tôi đã thấy điều này:

sc query "ServiceName" | findstr RUNNING 

dường như làm đại khái là điều đúng đắn. Nhưng, tôi lo lắng không đủ để làm việc trên các hệ điều hành không phải tiếng Anh.

+0

Nếu bạn thực sự cần phải làm i18n, bạn nên viết một ứng dụng truy vấn và đặt errorlevel. – hometoast

4

Bạn có thể sử dụng wmic với /locale tùy chọn

call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running 
if %ErrorLevel% EQU 0 (
    echo Running 
) else (
    echo Not running 
) 
2

Suy nghĩ một chút ngoài vòng cấm địa ở đây tôi sẽ đề xuất PowerShell đó có thể là một câu trả lời về up-to-date XP/2003 máy móc và chắc chắn trên Vista/2008 và mới hơn (thay vì .bat/.cmd). Bất cứ ai có một số Perl trong nền của họ sẽ cảm thấy ở nhà khá nhanh chóng.


$serviceName = "ServiceName"; 
$serviceStatus = (get-service "$serviceName").Status; 

if ($serviceStatus -eq "Running") { 
    echo "Service is Running"; 
} 
else { 
    #Could be Stopped, Stopping, Paused, or even Starting... 
    echo "Service is $serviceStatus"; 
} 

Một cách khác, nếu bạn có khoản đầu tư đáng kể trong lô là chạy tập lệnh PS dưới dạng một lớp lót, hãy trả lại mã thoát.


@ECHO off 
SET PS=powershell -nologo -command 
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}" 

ECHO.%ERRORLEVEL% 

Chạy như một lớp lót cũng nhận được chính sách ký mã PS mặc định với chi phí gây rối. Để đặt các lệnh PS trong một tệp .ps1 và chạy như powershell myCode.ps1, bạn có thể thấy ký các kịch bản PowerShell của bạn là cần thiết để chạy chúng một cách tự động (phụ thuộc vào môi trường của bạn). Xem http://www.hanselman.com/blog/SigningPowerShellScripts.aspx để biết chi tiết

11

Hãy quay trở lại trường cũ của lập trình hàng loạt trên cửa sổ

net start | find "Service Name" 

này sẽ làm việc ở khắp mọi nơi ...

+0

Và bạn có thể kiểm tra% errorlevel% sau đó. –

+0

_errorlevel_ là 1 cả khi dịch vụ tồn tại hay không. Vì vậy, tôi không thể sử dụng "tìm". (Win 7 Pro 64 bit) –

2

tôi sẽ đề nghị WMIC Service WHERE "Name = 'SericeName'" GET Started

hoặc WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId (ProcessID sẽ không nếu dịch vụ không bắt đầu)

Bạn có thể thiết lập mức độ lỗi dựa trên việc lợi nhuận trở về cựu "TRUE" hoặc sau này nonzero

+0

Đây thực sự là cách duy nhất để nhận trạng thái dịch vụ luôn trả về giá trị bằng tiếng Anh cho dù ngôn ngữ hệ điều hành là gì. –

0

Chỉ cần thêm vào danh sách nếu bạn đang sử dụng Powershell.

sc.exe query "ServiceName" | findstr RUNNING 

Lệnh dưới đây không hoạt động vì sc là bí danh cho Set-Content trong Powershell.

sc query "ServiceName" | findstr RUNNING 

find cũng không hoạt động trên Powershell vì một lý do nào đó mà tôi không biết.

sc.exe query "ServiceName" | find RUNNING 
2
sc query "servicename" | findstr STATE

ví dụ:

sc query "wuauserv" | findstr STATE

Để báo cáo những gì dịch vụ cập nhật Windows được làm, chạy/dừng, vv
này cũng dành cho Windows 10 là cảm ơn tôi sau này.

0
SERVICO.BAT 
@echo off 
echo Servico: %1 
if "%1"=="" goto erro 
sc query %1 | findstr RUNNING 
if %ERRORLEVEL% == 2 goto trouble 
if %ERRORLEVEL% == 1 goto stopped 
if %ERRORLEVEL% == 0 goto started 
echo unknown status 
goto end 
:trouble 
echo trouble 
goto end 
:started 
echo started 
goto end 
:stopped 
echo stopped 
goto end 
:erro 
echo sintaxe: servico NOMESERVICO 
goto end 

:end 
0
@ECHO OFF 
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING 
REM "MSSQLSERVER" is the name of Service for sample 
sc query "MSSQLSERVER" %1 | findstr RUNNING 
if %ERRORLEVEL% == 2 goto trouble 
if %ERRORLEVEL% == 1 goto stopped 
if %ERRORLEVEL% == 0 goto started 
echo unknown status 
goto end 
:trouble 
echo Oh noooo.. trouble mas bro 
goto end 
:started 
echo "SQL Server (MSSQLSERVER)" is started 
goto end 
:stopped 
echo "SQL Server (MSSQLSERVER)" is stopped 
echo Starting service 
net start "MSSQLSERVER" 
goto end 
:erro 
echo Error please check your command.. mas bro 
goto end 

:end 
+0

Thêm một số giải thích với câu trả lời cho cách câu trả lời này giúp OP trong việc khắc phục sự cố hiện tại –

0

Sử dụng Cygwin Bash với:

sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!" 

(Hãy chắc chắn rằng bạn có sc.exe trong PATH của bạn.)

0

tôi nhận thấy không có ai đề cập việc sử dụng các biểu thức thông thường khi sử dụng find/findstr Câu trả lời dựa trên. Điều đó có thể có vấn đề đối với các dịch vụ có tên tương tự.

phép nói rằng bạn có hai dịch vụ, CDPUserSvcCDPUserSvc_54530

Nếu bạn sử dụng hầu hết các find/findstr Đáp dựa trên đây cho đến nay, bạn sẽ nhận được giả tích cực cho CDPUserSvc truy vấn khi chỉ CDPUserSvc_54530 đang chạy.

Các /r/c tắc cho findstr thể giúp chúng ta xử lý rằng việc sử dụng hợp cụ thể, cũng như các nhân vật đặc biệt mà chỉ ra cuối dòng, $

Truy vấn này sẽ chỉ kiểm tra các hoạt động của dịch vụ CDPUserSvc và bỏ qua CDPUserSvc_54530

sc query|findstr /r /c:"CDPUserSvc$"

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