我想寫執行以下操作的批處理文件:如何通過批處理文件檢查服務是否正在運行並啓動它(如果未運行)?
- 檢查服務是否運行
- 如果它運行,退出批量
- 如果它沒有運行,啓動服務
的代碼示例我一派到目前爲止竟然不能用了,所以我決定不婆st他們。
啓動的服務是通過做:
net start "SERVICENAME"
- 如何檢查服務是否運行,以及如何使一個if語句在批處理文件?
- 我有點困惑。我必須通過網絡開始的論點是什麼?服務名稱或其顯示名稱?
我想寫執行以下操作的批處理文件:如何通過批處理文件檢查服務是否正在運行並啓動它(如果未運行)?
的代碼示例我一派到目前爲止竟然不能用了,所以我決定不婆st他們。
啓動的服務是通過做:
net start "SERVICENAME"
要檢查服務的狀態,請使用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"
)
)
是做什麼的說明:
關於你的第二個問題產生的狀態中,你會想傳遞給net start
參數是服務名稱,不顯示名稱。
太棒了。謝謝你的努力。不幸的是它不起作用?也許我太愚蠢了。我將「MyServiceName」替換爲「SCardSvr」(轉義)作爲測試,將所有內容都放入批處理文件中,執行它,但服務不啓動。即使我將net start替換爲其他文件,如打印到文件中,也不會執行。你介意請再看一下嗎? =) – citronas 2010-07-24 13:07:44
哎呀我在第一行有一些額外的東西...試試這個。如果它不起作用,當你從命令行運行sc查詢「SCardSvr」時會發生什麼? – 2010-07-24 13:21:59
你有引號中的「SCardSvr」嗎?我不相信它應該是, – LittleBobbyTables 2010-07-24 13:22:14
應該這樣做:
FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)
您可以使用下面的命令來查看服務是否運行與否:
sc query [ServiceName] | findstr /i "STATE"
當我運行它爲我的NOD32防病毒軟件,我得到:
STATE : 4 RUNNING
如果它停止,我會得到:
STATE : 1 STOPPED
您可以在變量中使用此值,然後確定是否使用NET START。
服務名稱應該是服務名稱,而不是顯示名稱。
感謝您的幫助,在嘗試整合您發佈的內容時,我大大提高了我的批處理技能;) – citronas 2010-07-24 13:39:19
要切換服務,請使用以下內容;
NET START 「分佈式事務處理協調器 」 || NET STOP 「分佈式 事務處理協調器」
它起作用是因爲退出代碼從開始。如果啓動命令失敗,可能是因爲它已經在運行(並且隨後以任何方式停止它都不會受到傷害),所以你試着停止它。 – 2012-03-27 15:34:16
該命令的結構是這樣的,如果網絡啓動失敗,它會停止它(由於||這意味着其他),但如果網絡啓動運行,則淨停止不執行。輝煌! – 2012-05-18 15:35:12
在編程中經常使用的非常簡單的技巧! – Birla 2014-08-06 04:55:33
寬多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進行處理。你可以看到服務屬性的服務的名稱。)
如果你用英文寫你的答案,對每個人來說都會更好。 – j0k 2012-09-03 12:34:29
不知道爲什麼downvote。如果可能的話,這是一個重要的點和避免字符串比較的理由。在這種情況下,您必須根據目標Windows安裝的默認語言更改字符串。 – 2012-09-13 07:50:20
@lc:爲每種語言包含答案是否合理?引用(或包含)一個資源,說明要搜索給定語言的字符串可能更有用。 – 2013-06-28 18:25:14
@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"
我也想發送的電子郵件,如果該服務已啓動這種方式使平添了幾分以@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.
)
)
)
)
我剛剛發現這個線索,並希望加入到討論中,如果人不希望使用批處理文件重新啓動服務。在Windows中,如果轉到服務,服務屬性和恢復,則會有一個選項。在這裏你可以設置服務的參數。喜歡在服務停止時重新啓動服務。此外,你甚至可以嘗試第二次嘗試做一些與重新啓動計算機不同的嘗試。
這是一個有用的答案,但重要的是要注意,這將只在服務停止並退出(-1)時才起作用。如果服務正常退出(即使出現錯誤消息),自動恢復也不會觸發。如果服務被用戶手動終止,它也不會觸發。 – 2016-01-06 09:22:19
與語言無關的版本。
@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
)
是的! 「太空」總是突然襲擊你的背部! – 2016-01-08 16:07:31
幾乎完美的答案。我只是修復了這一行: 網絡啓動「%ServiceName%」> nul ||( – Cesar 2017-01-24 23:16:46
我已經使腳本具有通用性,所以它允許我在Windows調度程序任務中使用,只需將Set ServiceName = Jenkins替換爲'Set ServiceName =%〜1'並將其命名爲'watch-service.bat'Jenkins'' – 2017-01-31 07:30:37
@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
使用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
}
}
dirty編程:當你想要做的唯一一件事就是啓動服務如果沒有運行,只需發出啓動命令。如果它沒有運行,它將啓動服務。如果它正在運行而不是您收到錯誤消息,但該服務正在運行(並且不停止)。髒,但它的作品。但是,只有在您必須啓動服務時才需要執行其他註釋,那麼請確保使用lc的清潔版本。 – 2012-03-08 18:05:06
@Peter Schuetze:是的,如果開始服務是唯一的目的,你的反對是正確的。我還包括記錄開始等等,所以我堅持lc的解決方案。 – citronas 2012-03-09 13:18:47