2008-12-09 177 views
39

我希望能夠查詢服務是否從Windows批處理文件運行。我知道我可以使用:如何從命令行測試服務是否正在運行

SC查詢 「服務名稱」

但是,這個轉儲出一些文字。我真正想要的是設置errorlevel環境變量,以便我可以對此採取措施。

你知道一個簡單的方法可以做到嗎?

UPDATE
感謝您的回答。我擔心解析文本的解決方案可能無法在非英文操作系統上運行。有沒有人知道解決這個問題的方法,或者我將不得不硬着頭皮寫一個控制檯程序來實現這一點。

+0

我只是一箇中國區域中國語言的Windows 7筆記本電腦測試中,「SC查詢...」命令的輸出仍然是英語。 – wangf 2015-08-31 07:15:13

+0

無論使用何種操作系統語言,都可以通過腳本輕鬆解析服務狀態我已經使用過`WMIC服務WHERE「名稱='SericeName'」GET Started/format:list`。它產生`State = Running` - 易於用正則表達式解析並且總是用英文。 – 2018-02-19 08:22:38

回答

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

找不到。 findstr的作品。 – 2015-07-30 08:07:11

+0

@imkheong,什麼操作系統「發現」不工作?它在win7上... ... – 2016-08-03 07:31:44

+0

@ShaiAlon,它是powershell,它沒有工作。它在通常的命令提示符(cmd.exe)上工作。 – 2016-08-04 09:00:33

1

嘗試

sc query state= all 

的服務列表和它們是否正在運行與否。

8

如果您不介意將net命令與grep結合使用,則可以使用以下腳本。

@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 
1

我發現這一點:

sc query "ServiceName" | findstr RUNNING 

似乎做大致正確的事情。但是,我擔心這不足以在非英語操作系統上工作。

4

你可以使用WMIC與/locale選項

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

這裏的箱子,我要提出的是PowerShell的可能答案上了最新的XP/2003的機器和外思考一點點當然在Vista/2008和更新(而不是.bat/.cmd)。任何在他們的背景中都有一些Perl的人應該很快就會感到在家。


$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"; 
} 

另一種方法,如果你有大量的批量投資是運行PS腳本作爲一個班輪,返回退出代碼。


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

ECHO.%ERRORLEVEL% 

作爲一行代碼運行也繞過了默認的PS代碼簽名策略,以犧牲混亂爲代價。要將PS命令放在.ps1文件中並運行,如powershell myCode.ps1,您可能發現簽署PowerShell腳本需要以自動方式運行它們(取決於您的環境)。見http://www.hanselman.com/blog/SigningPowerShellScripts.aspx的細節

11

讓我們回到老派一批編程在Windows

net start | find "Service Name" 

這將工作無處不在...

2

我建議 WMIC Service WHERE "Name = 'SericeName'" GET Started

WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId(的ProcessID將是零,如果服務未啓動)

您可以根據設定的誤差水平是否前者返回「TRUE」或後者返回非零

0

只要添加到列表中,如果您使用Powershell。

sc.exe query "ServiceName" | findstr RUNNING 

的命令如下不起作用,因爲sc是一個別名設置內容在PowerShell中。

sc query "ServiceName" | findstr RUNNING 

find也不會在PowerShell的一些原因不明我的工作。

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

例如:

sc query "wuauserv" | findstr STATE

要報告什麼的Windows更新服務是幹什麼的,運行/暫停等
這也適用於Windows 10以後感謝我。

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

使用Cygwin猛砸有:

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

(請確保您在您的PATH有sc.exe

0

我注意到使用find時,沒有人提到使用正則表達式/ findstr - 基於答案。對於類似命名的服務,這可能會有問題。

比方說你有兩個服務,CDPUserSvcCDPUserSvc_54530

如果您最常使用的find/findstr基於答案的到這裏爲止,你只CDPUserSvc_54530運行時得到誤報爲CDPUserSvc查詢。

/r/c開關,用於findstr可以幫助我們處理使用情況,以及特殊字符,表示該行的末尾,$

這個查詢只能驗證CDPUserSvc服務的運行而忽略CDPUserSvc_54530

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

相關問題