web-dev-qa-db-ja.com

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

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

271
Keng

SC(サービス制御)コマンドを使用すると、startstopよりもはるかに多くのオプションが得られます。

説明:[。] SCは、
 NTサービスコントローラおよびサービスとの通信に使用されるコマンドラインプログラムです。
使用法:
 ] <server> [command] [サービス名] ... 
 
オプション<server>の形式は "\\ ServerName"です。
 "sc [command]" 
コマンド:
 query -----------サービスのステータスを問い合わせます。または
はステータスを列挙します。 
 queryex ---------サービスの拡張ステータスを問い合わせます。または
はサービスのタイプのステータスを列挙します。 ---------サービスを開始します。
 pause -----------サービスにPAUSE制御要求を送信します。
質問----- INTERROGATE制御要求をサービスに送信します。
 continue -------- CONTINUE制御要求をサービスに送信します。
 s top ------------サービスにSTOP要求を送ります。
 config ----------サービスの設定を変更します(永続的)。 [ -  description] -----サービスの説明を変更します。
 failure ---------失敗したときにサービスが実行するアクションを変更します。
 qc ---- ----------サービスの構成情報を照会します。
 qdescription ----サービスの説明を照会します。
 qfailure --------照会失敗時にサービスによって実行されるアクション
 delete ----------サービスを(レジストリから)削除します。
 create ----------サービスを作成します。 (レジストリに追加します。)
 control ---------サービスにコントロールを送ります
 sdshow ----------サービスのセキュリティを表示します
 sdset -----------サービスのセキュリティ記述子を設定します。
 GetDisplayName  - サービスのDisplayNameを取得します。
 GetKeyName ---- - サービスのServiceKeyNameを取得します
 EnumDepend ------サービスの依存関係を列挙します
 
次のコマンドではサービス名は必要ありません。 ] sc <server> <command> <option> 
 boot ------------(ok | bad)前回の起動時に
を前回の起動時に保存するかどうかを示します。よく知られているブート設定
 Lock ------------サービスデータベースをロックします
 QueryLock ------- SCManagerデータベースのLockStatusを問い合わせます[。例:
 MyService 
を起動します。
332
Ferruccio
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は成功を示します。より高いものは失敗を示します。

Batファイルとして、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

編集20.04.2015

リターンコード:

NETコマンドは、文書化されたWin32_Serviceクラスの戻りコード(Service Not Active、Service Request Timeoutなど)を返さず、多くのエラーに対して単にErrorlevel 2を返します。

ここを見て: http://ss64.com/nt/net_service.html

195
Bill Michell

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%

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

27
Jonas Gulle

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

net start "Apache Tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the Tomcat services  
exit 1  
8
vanval

私はこれのために私の個人的なバッチファイルを作成しました、私のものは少し異なっています、しかしあなたが適当と思うように修正するのを遠慮しなくしてください。退屈していて、終了、開始、停止、または自動に設定できるように人々が入力できるように簡単な方法を作りたかったので、私は少し前にこれを作成しました。この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
7

net startnet stopからのリターンコードを使うことは私にとって最良の方法のようです。これを見てみてください: ネットスタートリターンコード

6
ZombieSheep

構文はいつも私を取得します....そう...

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

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

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

あなたのサービスオプス中毒者のために...あなたの理由コードとコメントを付けてください!すなわち「4」は「計画済み」に相当し、「保守のためにサーバーを停止する」とコメントしています。

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

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

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

しかし、それから再び...

最初のサービスが停止するのに長い時間がかかるのを見ているのですが、それに続くサービスの「ネットストップ」は何もしないようです。サービスマネージャでサービスを見てください、そして、その状態はまだ「開始」です - 「停止」への変更はありません。それでも私はSCMを使用して手動でこの2番目のサービスを停止することができ、それは3または4秒で停止します。

4
DaveH

または、このcmdを使ってリモートサービスを開始することができます。sc \\<computer> start <service>

3
onionpsy

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

これはエラーを生成するかもしれません:sc stop sc start

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

2
Kuleris

上記のJonasの例を使用して、0から24のエラーレベルの全リストを作成しました。 net startnet stopは成功のためにerrorlevelを、失敗のために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に変更して逆の動作をします。

2
Clinton

SCは、サービスを使ってあらゆることを実行できます...開始、停止、確認、構成など...

1
Axeman

時にはあなたは停止がうまくいかないことがわかります..

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

taskkill /pid [pid number] /f
1
andrew pate

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

sc config swprv start= Auto

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

  • レジストリ値を自動起動に変更するシステムの復元

    REG ADD "HKLM \ソフトウェア\マイクロソフト\ Windows NT\CurrentVersion\SystemRestore"/v DisableSR/t REG_DWORD/d 0/f

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

    Wmic.exe /名前空間:\ root\defaultパスSystemRestore CreateRestorePointの呼び出し "djibeはPCを保存しました"、100、12

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

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

楽しい

1
djibe

私はC#でWindowsサービスを書いている、停止/アンインストール/ビルド/インストール/開始ループがあまりにも面倒になった。ループを自動化するために、reploy.batという名前のミニスクリプトを書き、私のVisual Studio出力ディレクトリ(構築されたサービス実行可能ファイルを含むディレクトリ)にドロップしました。

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

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

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

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

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

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%

多分これは誰かに役立ちます:)

0
sh87