我希望能夠查詢服務是否從Windows批處理文件運行。我知道我可以使用:如何從命令行測試服務是否正在運行
SC查詢 「服務名稱」
但是,這個轉儲出一些文字。我真正想要的是設置errorlevel
環境變量,以便我可以對此採取措施。
你知道一個簡單的方法可以做到嗎?
UPDATE
感謝您的回答。我擔心解析文本的解決方案可能無法在非英文操作系統上運行。有沒有人知道解決這個問題的方法,或者我將不得不硬着頭皮寫一個控制檯程序來實現這一點。
我希望能夠查詢服務是否從Windows批處理文件運行。我知道我可以使用:如何從命令行測試服務是否正在運行
SC查詢 「服務名稱」
但是,這個轉儲出一些文字。我真正想要的是設置errorlevel
環境變量,以便我可以對此採取措施。
你知道一個簡單的方法可以做到嗎?
UPDATE
感謝您的回答。我擔心解析文本的解決方案可能無法在非英文操作系統上運行。有沒有人知道解決這個問題的方法,或者我將不得不硬着頭皮寫一個控制檯程序來實現這一點。
sc query "ServiceName" | find "RUNNING"
找不到。 findstr的作品。 – 2015-07-30 08:07:11
@imkheong,什麼操作系統「發現」不工作?它在win7上... ... – 2016-08-03 07:31:44
@ShaiAlon,它是powershell,它沒有工作。它在通常的命令提示符(cmd.exe)上工作。 – 2016-08-04 09:00:33
嘗試
sc query state= all
的服務列表和它們是否正在運行與否。
如果您不介意將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
我發現這一點:
sc query "ServiceName" | findstr RUNNING
似乎做大致正確的事情。但是,我擔心這不足以在非英語操作系統上工作。
你可以使用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
)
這裏的箱子,我要提出的是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的細節
讓我們回到老派一批編程在Windows
net start | find "Service Name"
這將工作無處不在...
我建議 WMIC Service WHERE "Name = 'SericeName'" GET Started
或WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId
(的ProcessID將是零,如果服務未啓動)
您可以根據設定的誤差水平是否前者返回「TRUE」或後者返回非零
只要添加到列表中,如果您使用Powershell。
sc.exe query "ServiceName" | findstr RUNNING
的命令如下不起作用,因爲sc
是一個別名設置內容在PowerShell中。
sc query "ServiceName" | findstr RUNNING
find
也不會在PowerShell的一些原因不明我的工作。
sc.exe query "ServiceName" | find RUNNING
sc query "servicename" | findstr STATE
例如:
sc query "wuauserv" | findstr STATE
要報告什麼的Windows更新服務是幹什麼的,運行/暫停等
這也適用於Windows 10以後感謝我。
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
@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
使用Cygwin猛砸有:
sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"
(請確保您在您的PATH有sc.exe
)
我注意到使用find
時,沒有人提到使用正則表達式/ findstr
- 基於答案。對於類似命名的服務,這可能會有問題。
比方說你有兩個服務,CDPUserSvc
和CDPUserSvc_54530
如果您最常使用的find
/findstr
基於答案的到這裏爲止,你只CDPUserSvc_54530
運行時得到誤報爲CDPUserSvc
查詢。
的/r
和/c
開關,用於findstr
可以幫助我們處理使用情況,以及特殊字符,表示該行的末尾,$
這個查詢只能驗證CDPUserSvc
服務的運行而忽略CDPUserSvc_54530
sc query|findstr /r /c:"CDPUserSvc$"
我只是一箇中國區域中國語言的Windows 7筆記本電腦測試中,「SC查詢...」命令的輸出仍然是英語。 – wangf 2015-08-31 07:15:13
無論使用何種操作系統語言,都可以通過腳本輕鬆解析服務狀態我已經使用過`WMIC服務WHERE「名稱='SericeName'」GET Started/format:list`。它產生`State = Running` - 易於用正則表達式解析並且總是用英文。 – 2018-02-19 08:22:38