batまたはcmdをスクリプト化して、エラーチェックでサービスを確実に停止および開始する(または何らかの理由で成功しなかったことを通知する)にはどうすればよいですか?
17 に答える
(service control) コマンドを使用すると、 &SC
よりも多くのオプションが提供されます。start
stop
説明: SC は、 NT サービス コントローラとサービス。 利用方法: sc <サーバー> [コマンド] [サービス名] ... オプション <server> の形式は「\\ServerName」です 「sc [コマンド]」と入力すると、コマンドに関する詳細なヘルプが表示されます。 コマンド: query-----------サービスのステータスを問い合わせる、または サービスの種類のステータスを列挙します。 queryex--------- サービスの拡張ステータスを問い合わせる、または サービスの種類のステータスを列挙します。 start -----------サービスを開始します。 一時停止 ----------- サービスに一時停止制御要求を送信します。 尋問----- INTERROGATE 制御要求をサービスに送信します。 continue-------- CONTINUE 制御要求をサービスに送信します。 stop------------ サービスに STOP リクエストを送信します。 config---------サービスの構成を変更します (永続的)。 description-----サービスの説明を変更します。 失敗---------失敗時にサービスによって実行されるアクションを変更します。 qc--------------サービスの構成情報を照会します。 qdescription----サービスの説明を照会します。 qfailure-------- 失敗時にサービスによって実行されるアクションを照会します。 delete---------サービスを (レジストリから) 削除します。 create--------- サービスを作成します。(レジストリに追加します)。 control--------- コントロールをサービスに送信します。 sdshow ----------サービスのセキュリティ記述子を表示します。 sdset-----------サービスのセキュリティ記述子を設定します。 GetDisplayName -- サービスの DisplayName を取得します。 GetKeyName------ サービスの ServiceKeyName を取得します。 EnumDepend------ サービスの依存関係を列挙します。 次のコマンドは、サービス名を必要としません。 sc <サーバー> <コマンド> <オプション> boot------------(ok | bad) 最後の起動が必要かどうかを示します 前回正常起動時の構成として保存される Lock------------ サービス データベースをロックします QueryLock-------SCManager データベースの LockStatus を照会します 例: sc start MyService
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クラスのリターンコード(Service Not Active、Service Request Timeoutなど)を返しません。多くのエラーの場合、エラーレベル2が返されます。
ここを見てください:http ://ss64.com/nt/net_service.html
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%
免責事項:私は頭のてっぺんからこれを書きましたが、うまくいくと思います。
コードをチェックする代わりに、これも機能します
net start "Apache tomcat" || goto ExitError
:End
exit 0
:ExitError
echo An error has occurred while starting the tomcat services
exit 1
このための個人用バッチ ファイルを作成しました。私のものは少し異なりますが、必要に応じて自由に変更してください。ちょっと前にこれを作成したのは、退屈で、人々が終了、開始、停止、または自動に設定できるようにする簡単な方法を作りたかったからです。この BAT ファイルは、単にサービス名を入力するように要求するだけで、あとは自動的に実行されます。私は彼がエラーを述べている何かを探していることに気づきませんでした。私はその部分を読み違えていたに違いありません。通常、これは行末に >> output.txt を入力することで実行できます。
%var% は、別のサービスを開始/停止するたびにバットファイルを変更する必要がなく、ユーザーが独自のサービスをこれに入力できるようにするための単なる方法です。
私が間違っている場合は、誰でも気軽にこれを修正できます。
@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
からのリターンコードを使用することは、私にとって最良の方法net start
のnet stop
ようです。これを見てみてください:NetStartリターンコード。
構文は常に私を取得します....そう...
両方のマシンの管理者であり、管理者として .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
または、次のコマンドでリモート サービスを開始できます。sc \\<computer> start <service>
手動でのサービスの再起動は問題ありません - services.msc には「再起動」ボタンがありますが、コマンド ラインでは sc コマンドと net コマンドの両方に「再起動」スイッチがなく、再起動が cmd/bat ファイルでスケジュールされている場合、サービスはすぐに停止して開始されます。サービスがまだ停止されていないため、エラーが発生します。シャットダウンするのに時間がかかります。
これにより、エラーが発生する場合があります: sc stop sc start
タイムアウトを挿入することをお勧めします。私は ping を使用します (1 秒ごとに ping を実行します): sc stop ping localhost -n 60 sc start
SC
サービスのすべてを実行できます...開始、停止、チェック、構成など...