2009-12-16 58 views
10

如何檢查WIN32服務是否存在,如果有,請執行一些操作?如果服務存在條件

+0

什麼樣的服務是什麼系統?請提供更多的上下文。 – 2009-12-16 16:57:38

+0

這將是一個本地服務,可以說名爲ABC。如果它作爲Visual Studio中的後期構建事件的一部分存在,我需要重新啓動該服務。 VS post生成事件基本上是批處理/ dos(??)命令。 – Burt 2009-12-16 16:59:23

回答

10

在我頭頂,可以使用「net」命令檢查是否正在運行特定的服務,如bmargulies所述,將結果輸入「find」。 像下面這樣的東西會檢查一個服務是否正在運行,如果是的話就停下來。然後,您可以啓動它,而不必擔心它是否已經運行或不:

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

如果您使用FINDSTR做搜索,因爲一些其他的答案的建議,那麼你將檢查ERRORLEVEL等於爲0(零)......如果是,那麼你已經找到了字符串你正在尋找:

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

最本質的DOS命令將設置ERRORLEVEL,讓您檢查是否像一個查找成功。

18

你不能在DOS下這樣做,因爲DOS不是Windows,甚至沒有「服務」的概念。

在Windows批處理文件可以使用sc命令查找服務:

sc query | findstr SERVICE_NAME 

這將枚舉所有服務,併產生各自的名稱。

您可以

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

特定服務搜索記住這個搜索是區分大小寫的。您可以將/I開關添加到findstr以避免這種情況。

1

如何使用WMIC

首先列出所有的進程,然後用grep的進程名。如果不存在,則不會打印結果。

wmic service |findstr "ProcessName" 

例子:

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

如何在if語句中工作? – Burt 2009-12-17 10:14:21

+0

@Burt:如果語句用什麼語言?批處理,VBScript,C#甚至Perl?當然,如果你安裝wc(guu32中的coreutils的一部分),你會做c:> wmic service | findstr「Search」| wc -l,然後編寫一些代碼來獲取該數字以確定。 – 2009-12-17 17:21:42

4

只是一個增編接受的答案。如果您正在尋找除重新啓動服務之外的其他事情,並且正在查看是否安裝了該服務。

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

在這種情況下,狀態=所有很重要,因爲如果服務沒有啓動,它會被解釋爲未安裝,這是兩回事。

+0

如上所述,這應該是:'如果不是ERRORLEVEL 1(** My Operation **)' – bstoney 2016-02-23 03:32:24

3

不應成功測試:「if(not)errorlevel 1」??

在windows shell中「如果errorlevel#」意味着錯誤級別是#或更高,所以「如果錯誤級別0」一直是真的。

+0

這是對「如何測試運行可執行文件是否有效」的答案,但它與查看服務無關已安裝或正在運行 – 2013-12-22 18:42:07

+0

我知道了,但我目前無權發表評論。 – user2956477 2015-09-14 18:49:44

2

我使用下面的代碼:

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

如果爲MyService沒有找到,%ERRORLEVEL%會在1由FIND設置,否則它會停留在0。指令IF%ERRORLEVEL%EQU 0允許您測試最後一種情況並繼續對您的服務進行操作。

IF ERRORLEVEL 0 NET STOP MyService 

將不起作用,因爲如果%ERRORLEVEL%大於或等於零,它將執行命令。

在Visual Studio後期生成事件,你必須把一個!

EXIT 0 

末,因爲VS將會檢測到%ERRORLEVEL%= 0,它會認爲後生成事件已失敗。小心使用它,因爲這會隱藏命令序列中的所有錯誤。

有了這一招,你可以忽略錯誤並使用這個在你的後生成事件重新啓動服務:

NET STOP MyService 
NET START MyService 
EXIT 0