バッチまたはcmdファイルを介してサービスを停止して開始しますか?


288

エラーチェックでサービスを確実に停止および開始するようにbatまたはcmdをスクリプト化するにはどうすればよいですか(または何らかの理由でサービスが成功しなかったことを知らせてください)?


(batとcmdの指示が必要なため)少しおかしいかもしれませんが、PowerShellは、このようなアクションを実行するための多くの制御とフィードバックを提供します。
GvS 2008

回答:


347

SC(サービス制御)コマンドを使用すると、単なるstart&以外の多くのオプションが提供されますstop

  説明:
          SCは、との通信に使用されるコマンドラインプログラムです。
          NTサービスコントローラとサービス。
  使用法:
      sc <サーバー> [コマンド] [サービス名] ...

      オプション<server>の形式は "\\ ServerName"です
      「sc [command]」と入力すると、コマンドの詳細なヘルプが表示されます。
      コマンド:
        query -----------サービスのステータスを問い合わせます。
                        サービスのタイプのステータスを列挙します。
        queryex ---------サービスの拡張ステータスを照会する、または
                        サービスのタイプのステータスを列挙します。
        start -----------サービスを開始します。
        pause ----------- PAUSE制御要求をサービスに送信します。
        interrogate -----サービスにINTERROGATE制御要求を送信します。
        continue -------- CONTINUE制御要求をサービスに送信します。
        stop ------------サービスにSTOP要求を送信します。
        config ----------サービス(永続)の構成を変更します。
        description -----サービスの説明を変更します。
        失敗---------失敗時にサービスによって実行されるアクションを変更します。
        qc --------------サービスの構成情報を照会します。
        qdescription ----サービスの説明を照会します。
        qfailure --------障害時にサービスによって実行されたアクションを照会します。
        削除----------(レジストリから)サービスを削除します。
        create ----------サービスを作成します。(レジストリに追加します)。
        control ---------サービスにコントロールを送信します。
        sdshow ----------サービスのセキュリティ記述子を表示します。
        sdset -----------サービスのセキュリティ記述子を設定します。
        GetDisplayName-サービスのDisplayNameを取得します。
        GetKeyName ------サービスのServiceKeyNameを取得します。
        EnumDepend ------サービスの依存関係を列挙します。

      次のコマンドはサービス名を必要としません。
      sc <サーバー> <コマンド> <オプション>
        boot ------------(ok | bad)最後のブートが必要かどうかを示します
                        最新の既知のブート構成として保存される
        ロック------------サービスデータベースをロックします
        QueryLock ------- SCManagerデータベースのLockStatusを照会します
  例:
          MyServiceのsc開始

1
これはネットスタート/ストップよりも優れていることに同意します。リモートマシンのサービスをタッチするオプションもあることに注意してください。
アウトロープログラマ

1
すばらしい答えです。ただし、「SC start service」を実行するには、管理者である必要があります。私はここでその解決策を見つけました。(受け入れられた回答には解決策が含まれています)
Michael K.

56
SCの問題は、アクションが完了した後ではなく、コマンドがすぐに戻ることです。バッチファイル(停止して開始)を介してサービスを再起動する場合、停止はすぐに戻り、サービスは停止していないため、開始は失敗します。アクションが完了した後、ネットストップ/スタートは戻るので、この問題はありません。
Dom

管理者モードでcmdを開いたところ、エラーが発生しましたこのコマンドの構文は次のとおりです。NETSTOPサービス
Satish Singh

サービスが正しく停止しているかどうかを確認する方法はありますか?2020年に?
Anand Varkey Philips

212
net start [serviceName]

そして

net stop [serviceName]

彼らが成功したか失敗したかをはっきりと伝えてください。例えば

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

バッチファイルから実行している場合は、戻りコードのERRORLEVELにアクセスできます。0は成功を示します。それ以上の値は失敗を示します。

バットファイルとしてerror.bat

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

出力は次のようになります。

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

戻りコード

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

2015年4月20日編集

戻りコード:

NETコマンドは、文書化されたWin32_Serviceクラスの戻りコード(サービスがアクティブではない、サービスリクエストのタイムアウトなど)を返さず、多くのエラーの場合、単純にErrorlevel 2を返します。

ここを見てください:http : //ss64.com/nt/net_service.html


1
NET ではない一方で、単にサービス関連機能のためにSC あるだけのサービス関連機能のために。
2012

3
"net"コマンドがブロックし、サービスが開始または停止するのを待ってから、バッチスクリプトの実行が続行されるため、この回答の方が適しています。
スティーブン

(編集によると)ほとんどの場合、errorlevel返される値は2であるため、エラー結果の解釈方法についてはこちらをご覧ください
HeyJude

28

NET STARTコマンドを使用してから、ERRORLEVEL環境変数を確認できます。

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

免責事項:私はこれを頭の上から書きましたが、うまくいくと思います。


8

コードをチェックする代わりに、これも機能します

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

7

私はこのための個人用バッチファイルを作成しました。私のものは少し異なりますが、必要に応じて自由に変更してください。退屈で、終了、開始、停止、または自動設定を入力できる簡単な方法を作りたかったので、少し前に作成しました。このBATファイルは、サービス名を入力するように要求するだけで、残りは自動的に行われます。私は彼が何かエラーを述べている何かを探していたことに気づかなかった、私はその部分を誤って読んだに違いない。通常、これは行の最後に>> output.txtを入力することで実行できます。

%var%は、別のサービスを開始/停止するたびにbatファイルを変更しなくても、ユーザーが独自のサービスをこれに入力できるようにするための手段です。

私が間違っている場合は、誰でも自由に修正できます。

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

1
通常、コードのみの回答は適切ではありません。ソリューションについて詳しく説明したり、説明コメントを追加したりできますか?
2015年

2
退屈で、終了、開始、停止、または自動設定を入力できる簡単な方法を作りたかったので、少し前に作成しました。このBATファイルは、サービス名を入力するように要求するだけで、残りは自動的に行われます。
Nathanial Wilson、2015

6

からの戻りコードを使用することはnet startnet stop私にとって最良の方法のようです。これを見てみてください:Net Start戻りコード


2
リンクされたページは存在しません。そのため、これはコメントの詳細です。
Neolisk

5

構文はいつも私を捕まえます...だから...

両方のマシンの管理者で、管理者として.batを実行し、マシンが同じドメインにある場合に、(別のマシンの)リモートサービスを強制終了するバッチファイルに行を追加する方法を明示的に示します。マシン名はUNC形式\ myserverに従います

sc \\ip.ip.ip.ip stop p4_1

この場合、Service Managerでサービスのプロパティを表示すると、p4_1はサービス名と表示名の両方でした。サービス名を使用する必要があります。

Service Ops中毒者のために...理由コードとコメントを必ず追加してください!つまり、「計画済み」に等しい「4」とコメントし、「メンテナンスのためにサーバーを停止しています」

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance

1
別のユーザーIDとパスワードを使用してログオンする必要がある場合、どうすればよいですか?
Frantumn 2014年

1
CMD他のユーザー/ IDとして実行し、runas /user:Domain\UserName cmdパスワードを入力します。CMDは、指定されたユーザーアカウントとして実行を開始します。
user4317867 2015

4

「ネットストップ」でサービスが止まると思います。悲しいことに、現実はそれほど白黒ではありません。サービスの停止に時間がかかる場合、コマンドはサービスが停止する前に戻ります。ただし、エラーレベルを確認しないとわかりません。

解決策は、サービスが停止するまでサービスの状態を探してループし、ループするたびに一時停止することです。

しかし、再び...

最初のサービスの停止に時間がかかり、その後のサービスの「ネットストップ」で何も実行されないようです。サービスマネージャーでサービスを確認します。その状態はまだ「開始済み」です。「停止中」に変更はありません。しかし、この2番目のサービスはSCMを使用して手動で停止でき、3秒または4秒で停止します。


3

または、次のcmdでリモートサービスを開始できます。 sc \\<computer> start <service>


3

上記のJonasの例を使用して、0〜24のエラーレベルの完全なリストを作成しました。他の投稿は正解でnet startあり、成功したnet stop場合はerrorlevel0、失敗した場合は2 のみを使用します。

しかし、これは私にとってうまくいきました:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

に変更stopstart、逆に動作します。


3

手動によるサービスの再起動は問題ありません-services.mscには「再起動」ボタンがありますが、コマンドラインではscコマンドとnetコマンドの両方に「再起動」スイッチがありません。再起動がcmd / batファイルでスケジュールされている場合、サービスはすぐに停止して開始されます。サービスはまだ停止されていないためエラーが発生し、シャットダウンするまでに時間がかかります。

これはエラーを生成する可能性があります:sc stop sc start

タイムアウトを挿入することをお勧めします。pingを使用します(1秒ごとにpingします)。sc stop ping localhost -n 60 sc start


2

以下は、バッチを使用してシステムの復元を開始するWindows 10コマンドです。

sc config swprv start= Auto

これらのコマンドも好きかもしれません:

  • レジストリ値を変更してシステムの復元を自動開始する

    REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f

  • システムの復元ポイントを作成する

    Wmic.exe / Namespace:\ root \ default Path SystemRestore Call CreateRestorePoint "djibe saved your PC"、100、12

  • システムの復元のディスク使用量を変更する

    vssadminがshadowstorageのサイズを変更します/ for = C:/ on = C:/ maxsize = 10%

楽しい


1

SC サービスですべてを実行できます...開始、停止、チェック、構成など...


1

ストップが機能しないことがあります。

私のSQlServerは時々これを行います。次のコマンドラインを使用すると、強制終了されます。本当に止まらないものを殺すためにスクリプトが本当に必要な場合。最後の手段としてこれをやってもらいます

taskkill /pid [pid number] /f

0

C#でWindowsサービスを書いていますが、stop / uninstall / build / install / startループが疲れすぎました。ミニスクリプトを書き、それreploy.batを呼び出して、Visual Studioの出力ディレクトリ(ビルドされたサービス実行可能ファイルがあるディレクトリ)にドロップして、ループを自動化します。

これらの3つの変数を設定するだけです

servicename :これはWindowsサービスコントロールパネル(services.msc)に表示されます

slndir :ソリューション(.sln)ファイルを含むフォルダー(完全パスではない)

binpath :ビルドからのサービス実行可能ファイルへのフルパス(フォルダーパスではない)

注:コマンドを機能させるには、Visual Studio Developer Command Lineから実行する必要がありますmsbuild

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

多分これは誰かを助ける:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.