2010-07-24 118 views
71

我想寫執行以下操作的批處理文件:如何通過批處理文件檢查服務是否正在運行並啓動它(如果未運行)?

  • 檢查服務是否運行
    • 如果它運行,退出批量
    • 如果它沒有運行,啓動服務

的代碼示例我一派到目前爲止竟然不能用了,所以我決定不婆st他們。

啓動的服務是通過做:

net start "SERVICENAME" 
  1. 如何檢查服務是否運行,以及如何使一個if語句在批處理文件?
  2. 我有點困惑。我必須通過網絡開始的論點是什麼?服務名稱或其顯示名稱?
+2

dirty編程:當你想要做的唯一一件事就是啓動服務如果沒有運行,只需發出啓動命令。如果它沒有運行,它將啓動服務。如果它正在運行而不是您收到錯誤消息,但該服務正在運行(並且不停止)。髒,但它的作品。但是,只有在您必須啓動服務時才需要執行其他註釋,那麼請確保使用lc的清潔版本。 – 2012-03-08 18:05:06

+0

@Peter Schuetze:是的,如果開始服務是唯一的目的,你的反對是正確的。我還包括記錄開始等等,所以我堅持lc的解決方案。 – citronas 2012-03-09 13:18:47

回答

123

要檢查服務的狀態,請使用sc query <SERVICE_NAME>。對於批處理文件中的塊,check the documentation

下面的代碼將檢查服務MyServiceName的狀態,並啓動它,如果它沒有運行(IF塊會如果服務沒有運行執行):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "  STATE"') do (
    if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here 
    REM For example, the following line 
    net start "MyServiceName" 
) 
) 

是做什麼的說明:

  1. 查詢服務的屬性。
  2. 查找包含文字「STATE」的行
  3. 將該行標記,並取出包含服務狀態的第3個標記。
  4. 測試對字符串「RUNNING」

關於你的第二個問題產生的狀態中,你會想傳遞給net start參數是服務名稱,顯示名稱。

+0

太棒了。謝謝你的努力。不幸的是它不起作用?也許我太愚蠢了。我將「MyServiceName」替換爲「SCardSvr」(轉義)作爲測試,將所有內容都放入批處理文件中,執行它,但服務不啓動。即使我將net start替換爲其他文件,如打印到文件中,也不會執行。你介意請再看一下嗎? =) – citronas 2010-07-24 13:07:44

+0

哎呀我在第一行有一些額外的東西...試試這個。如果它不起作用,當你從命令行運行sc查詢「SCardSvr」時會發生什麼? – 2010-07-24 13:21:59

+1

你有引號中的「SCardSvr」嗎?我不相信它應該是, – LittleBobbyTables 2010-07-24 13:22:14

12

應該這樣做:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING" 
IF ERRORLEVEL 1 SC start %%a) 
17

您可以使用下面的命令來查看服務是否運行與否:

sc query [ServiceName] | findstr /i "STATE" 

當我運行它爲我的NOD32防病毒軟件,我得到:

STATE      : 4 RUNNING 

如果它停止,我會得到:

STATE      : 1 STOPPED 

您可以在變量中使用此值,然後確定是否使用NET START。

服務名稱應該是服務名稱,而不是顯示名稱。

+1

感謝您的幫助,在嘗試整合您發佈的內容時,我大大提高了我的批處理技能;) – citronas 2010-07-24 13:39:19

27

要切換服務,請使用以下內容;

NET START 「分佈式事務處理協調器 」 || NET STOP 「分佈式 事務處理協調器」

+1

它起作用是因爲退出代碼從開始。如果啓動命令失敗,可能是因爲它已經在運行(並且隨後以任何方式停止它都不會受到傷害),所以你試着停止它。 – 2012-03-27 15:34:16

+3

該命令的結構是這樣的,如果網絡啓動失敗,它會停止它(由於||這意味着其他),但如果網絡啓動運行,則淨停止不執行。輝煌! – 2012-05-18 15:35:12

+0

在編程中經常使用的非常簡單的技巧! – Birla 2014-08-06 04:55:33

4

寬多SE使用Windows的西班牙語,ELcódigo德貝quedar ASI(在西班牙語中使用Windows時,代碼是):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "  ESTADO"') do (
    if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here 
    REM For example, the following line 
    net start MYSERVICE 
) 
) 

Reemplazar MYSERVICE CON EL農佈雷德爾SERVICIO闕本身desea procesar。 Puedes ver el nombre del servicio viendo las propiedades del servicio。 (與服務的名稱替換MYSERVICE進行處理。你可以看到服務屬性的服務的名稱。)

+8

如果你用英文寫你的答案,對每個人來說都會更好。 – j0k 2012-09-03 12:34:29

+1

不知道爲什麼downvote。如果可能的話,這是一個重要的點和避免字符串比較的理由。在這種情況下,您必須根據目標Windows安裝的默認語言更改字符串。 – 2012-09-13 07:50:20

+2

@lc:爲每種語言包含答案是否合理?引用(或包含)一個資源,說明要搜索給定語言的字符串可能更有用。 – 2013-06-28 18:25:14

2
@echo off 

color 1F 


@sc query >%COMPUTERNAME%_START.TXT 


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul 

IF ERRORLEVEL 0 EXIT 

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc" 
1

我也想發送的電子郵件,如果該服務已啓動這種方式使平添了幾分以@Ic代碼只是想我會張貼它,以防萬一它幫助任何人。我用的SendMail但也有其他的命令行選項How to send a simple email from a Windows batch file?

set service=MyServiceName 

for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "  STATE"') do (
    if /I "%%H" NEQ "RUNNING" (

    net start %service% 

    for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "  STATE"') do (
     if /I "%%H" EQ "RUNNING" (
     SendMail /smtpserver localhost /to [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% succeded. 
    ) else (
     SendMail /smtpserver localhost /to [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% failed. 
    ) 
    ) 

) 
) 
5

我剛剛發現這個線索,並希望加入到討論中,如果人不希望使用批處理文件重新啓動服務。在Windows中,如果轉到服務,服務屬性和恢復,則會有一個選項。在這裏你可以設置服務的參數。喜歡在服務停止時重新啓動服務。此外,你甚至可以嘗試第二次嘗試做一些與重新啓動計算機不同的嘗試。

+2

這是一個有用的答案,但重要的是要注意,這將只在服務停止並退出(-1)時才起作用。如果服務正常退出(即使出現錯誤消息),自動恢復也不會觸發。如果服務被用戶手動終止,它也不會觸發。 – 2016-01-06 09:22:19

9

與語言無關的版本。

@Echo Off 
Set ServiceName=Jenkins 


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName% 

    Net start "%ServiceName%">nul||(
     Echo "%ServiceName%" wont start 
     exit /b 1 
    ) 
    echo "%ServiceName%" started 
    exit /b 0 
)||(
    echo "%ServiceName%" working 
    exit /b 0 
) 
+0

是的! 「太空」總是突然襲擊你的背部! – 2016-01-08 16:07:31

+0

幾乎完美的答案。我只是修復了這一行: 網絡啓動「%ServiceName%」> nul ||( – Cesar 2017-01-24 23:16:46

+0

我已經使腳本具有通用性,所以它允許我在Windows調度程序任務中使用,只需將Set ServiceName = Jenkins替換爲'Set ServiceName =%〜1'並將其命名爲'watch-service.bat'Jenkins'' – 2017-01-31 07:30:37

0
@Echo off 

Set ServiceName=wampapache64 

SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(

echo %ServiceName% not running 
echo 

Net start "%ServiceName%" 


    SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
     Echo "%ServiceName%" wont start 
    ) 
     echo "%ServiceName%" started 

)||(
    echo "%ServiceName%" was working and stopping 
    echo 

    Net stop "%ServiceName%" 

) 


pause 
1

使用PowerShell腳本啓動服務。您可以將其鏈接到任務計劃程序並按需要間隔或觸發它。 將其創建爲PS1文件,即擴展名爲PS1的文件,然後讓此文件從任務調度程序觸發。

要任務調度啓動一站式服務

如果你使用的是它在服務器上使用此參數中

-noprofile -ExecutionPolicy旁路-file「C:\服務重新啓動腳本\ StopService.PS1」

通過運行相同的CMD上驗證它是否工作應在任務調度工作也

$Password = "Enter_Your_Password" 
$UserAccount = "Enter_Your_AccountInfor" 
$MachineName = "Enter_Your_Machine_Name" 
$ServiceList = @("test.SocketService","test.WcfServices","testDesktopService","testService") 
$PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force 
$Credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserAccount, $PasswordSecure 

$LogStartTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt" 
$FileDateTimeStamp = Get-Date -Format "MM-dd-yyyy_hh" 
$LogFileName = "C:\Users\krakhil\Desktop\Powershell\Logs\StartService_$FileDateTimeStamp.txt" 


#code to start the service 

"`n####################################################################" > $LogFileName 
"####################################################################" >> $LogFileName 
"###################### STARTING SERVICE ##########################" >> $LogFileName 

for($i=0;$i -le 3; $i++) 
{ 
"`n`n" >> $LogFileName 
$ServiceName = $ServiceList[$i] 
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName 

Write-Output "`n####################################" 
Write-Output "Starting Service - " $ServiceList[$i] 

"$LogStartTime => Starting Service: $ServiceName" >> $LogFileName 
Start-Service $ServiceList[$i] 

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]} 

if($ServiceState.Status -eq "Running") 
{ 
"$LogStartTime => Started Service Successfully: $ServiceName" >> $LogFileName 
Write-Host "`n Service " $ServiceList[$i] " Started Successfully" 
} 
else 
{ 
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName 
Write-Output "`n Service didn't Start. Current State is - " 
Write-Host $ServiceState.Status 
} 
} 

#code to stop the service 

"`n####################################################################" > $LogFileName 
"####################################################################" >> $LogFileName 
"###################### STOPPING SERVICE ##########################" >> $LogFileName 

for($i=0;$i -le 3; $i++) 
{ 
"`n`n" >> $LogFileName 
$ServiceName = $ServiceList[$i] 
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName 

Write-Output "`n####################################" 
Write-Output "Stopping Service - " $ServiceList[$i] 

"$LogStartTime => Stopping Service: $ServiceName" >> $LogFileName 
Stop-Service $ServiceList[$i] 

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]} 

if($ServiceState.Status -eq "Stopped") 
{ 
"$LogStartTime => Stopped Service Successfully: $ServiceName" >> $LogFileName 
Write-Host "`n Service " $ServiceList[$i] " Stopped Successfully" 
} 
else 
{ 
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName 
Write-Output "`nService didn't Stop. Current State is - " 
Write-Host $ServiceState.Status 
} 
} 
相關問題