web-dev-qa-db-ja.com

サービスがバッチファイルで実行されているかどうかを確認し、実行されていない場合は開始する方法

次の操作を実行するバッチファイルを作成します。

  • サービスが実行されているかどうかを確認してください
    • 実行中の場合は、バッチを終了します
    • 実行されていない場合は、サービスを開始します

これまでにグーグルで検索したコードサンプルは動作しないことが判明したため、それらを投稿しないことにしました。

サービスの開始は次の方法で行います。

net start "SERVICENAME"
  1. サービスが実行されているかどうかを確認するにはどうすればよいですか?バッチファイルでifステートメントを作成する方法は?
  2. 私は少し混乱しています。ネットスタートに渡す必要がある引数は何ですか?サービス名またはその表示名?
81
citronas

サービスの状態を確認するには、sc query <SERVICE_NAME>を使用します。バッチファイル内のifブロックについては、 ドキュメントを確認してください

次のコードは、サービス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」に対してテストします

2番目の質問については、net startに渡す引数はサービス名であり、not表示名です。

148
lc.

サービスを切り替えるには、次を使用します。

NET START "分散トランザクションコーディネーター" || NET STOP "分散トランザクションコーディネーター"

29
Coops

次のコマンドを使用して、サービスが実行されているかどうかを確認できます。

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

NOD32 Antivirusで実行すると、次の結果が得られます。

STATE                       : 4 RUNNING

それが停止した場合、私は得るでしょう:

STATE                       : 1 STOPPED

これを変数で使用して、NET STARTを使用するかどうかを決定できます。

サービス名は、表示名ではなくサービス名にする必要があります。

19

それはそれを行う必要があります:

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

言語に依存しないバージョン。

@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
)
10
Dr.eel

このスレッドを見つけたので、バッチファイルを使用してサービスを再起動したくない場合は、ディスカッションに追加したかったのです。 Windowsでは、[サービス]、[サービスプロパティ]、[回復]の順に選択するオプションがあります。ここで、サービスのパラメーターを設定できます。サービスが停止した場合にサービスを再起動したい。また、2回目の失敗試行で、コンピューターの再起動時とは異なることを行うこともできます。

5
sagelightning

Cuando seはWindows enEspañol、elcódigodebe 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 nom bre del servicio que se desea procesar。 Puedes ver el nombre del servicio viendo las propiedades del servicio。 (MYSERVICEを処理するサービスの名前に置き換えます。サービスのプロパティでサービスの名前を確認できます。)

4
Daniel Serrano
@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"
2
Logan78

また、この方法でサービスが開始された場合はメールを送信したかったので、@ Icコードに少し追加して、だれでも助けになった場合に投稿すると思いました。 SendMailを使用しましたが、他のコマンドラインオプションがあります Windowsバッチファイルから簡単な電子メールを送信する方法?

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.
      )
    )

  )
)
1
BYoung

Powershellスクリプトを使用してサービスを開始します。これをタスクスケジューラにリンクし、間隔または必要に応じてトリガーできます。これをPS1ファイル、つまりPS1拡張子のファイルとして作成し、このファイルをタスクスケジューラからトリガーします。

停止サービスを開始するには

あなたがサーバーでそれを使用している場合、タスクスケジューラで引数でこれを使用してください

-noprofile -executionpolicy bypass -file "C:\ Service Restart Scripts\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
}
}
1
KR Akhil

@DanielSerranoの回答に関連して、最近、sc.exeコマンドのローカライズ、つまりスペイン語に少し触れました。私の提案は、数値のサービス状態を保持する行とトークンを特定し、それを解釈することです。

@echo off

rem TODO: change to the desired service name
set TARGET_SERVICE=w32time

set SERVICE_STATE=
rem Surgically target third line, as some locales (such as Spanish) translated the utility's output
for /F "skip=3 tokens=3" %%i in ('""%windir%\system32\sc.exe" query "%TARGET_SERVICE%" 2>nul"') do (
  if not defined SERVICE_STATE set SERVICE_STATE=%%i
)
rem Process result
if not defined SERVICE_STATE (
  echo ERROR: could not obtain service state!
) else (
  rem NOTE: values correspond to "SERVICE_STATUS.dwCurrentState"
  rem https://msdn.Microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
  if not %SERVICE_STATE%==4 (
    echo WARNING: service is not running
    rem TODO: perform desired operation
    rem net start "%TARGET_SERVICE%"
  ) else (
    echo INFORMATION: service is running
  )
)

テスト済み:

  • Windows XP(32ビット)英語
  • Windows 10(32ビット)スペイン語
  • Windows 10(64ビット)英語
0

以下のWindowsサーバー2012では、私にとってはうまくいきました。 「SERVICENAME」のみを実際のサービス名に置き換えます。

@ECHO OFF
SET SvcName=SERVICENAME

SC QUERYEX "%SvcName%" | FIND "STATE" | FIND /v "RUNNING" > NUL && (
    ECHO %SvcName% is not running 
    ECHO START %SvcName%

    NET START "%SvcName%" > NUL || (
        ECHO "%SvcName%" wont start 
        EXIT /B 1
    )
    ECHO "%SvcName%" is started
    EXIT /B 0
) || (
    ECHO "%SvcName%" is running
    EXIT /B 0
)
0
Magige Daniel

おそらくもっと簡単な方法でしょうか?ここの回答リストに追加するだけです:

@for /f "tokens=1,* delims=: " %%a in ('sc queryex state=Inactive') do net start "%%b"
0
Gerhard Barnard
@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
0
Aylian Craspa