バッチファイルから Windows サービスを操作することは、システム管理の自動化において非常によく使われるパターンです。
IIS の再起動、SQL Server の停止、社内アプリのサービス起動など、手作業で行っていた操作をバッチ化することで作業ミスをなくし、タスクスケジューラと組み合わせることで完全自動化も可能です。
この記事では net start/stop と sc コマンドの使い方、状態確認、自動起動設定、エラーハンドリングまで網羅的に解説します。
net start / net stop の基本
net start と net stop は Windows の伝統的なサービス操作コマンドです。シンプルで覚えやすいのが特徴です。
net-start-stop.bat
@echo off
:: サービスを起動する
net start "Spooler"
:: サービスを停止する
net stop "Spooler"
:: 実行中のサービス一覧を表示
net start
補足:サービス名はサービスの「短い名前(ServiceName)」を使います。サービス管理画面(services.msc)でサービスのプロパティを開くと「サービス名」として確認できます。表示名(Display Name)と異なる場合があるので注意してください。
sc コマンドの基本
sc(Service Control)コマンドは、サービスの起動・停止・状態確認・設定変更など、より細かい制御が可能な上位互換ツールです。
sc-basic.bat
:: sc start でサービスを起動
sc start Spooler
:: sc stop でサービスを停止
sc stop Spooler
:: sc query でサービスの状態を確認
sc query Spooler
:: sc config でスタートアップの種類を変更
sc config Spooler start= auto
注意:sc config のオプションは start= auto のように = の後にスペースが必要です(start=auto ではなく start= auto)。これは sc コマンドの仕様なので注意してください。
net コマンドと sc コマンドの違い
| 観点 |
net start/stop |
sc コマンド |
| 構文のシンプルさ |
シンプル |
やや複雑 |
| 待機(完了まで待つ) |
待機する |
待機しない(非同期) |
| 状態確認 |
一覧のみ |
詳細情報(PID等) |
| スタートアップ設定 |
× |
○(sc config) |
| サービス作成・削除 |
× |
○(sc create/delete) |
| リモートマシンへの操作 |
○(\\コンピュータ名) |
○(\\コンピュータ名) |
サービスの状態を確認する
sc query でサービスの現在の状態(起動中・停止中など)を確認できます。
sc-query.bat
@echo off
:: サービスの状態を確認(基本情報)
sc query W3SVC
:: より詳細な情報(PID・タイプも含む)
sc queryex W3SVC
:: すべての実行中サービスを一覧表示
sc query type= service state= all
sc query の出力で STATE 行を確認します:
| STATE 値 |
意味 |
| RUNNING |
実行中 |
| STOPPED |
停止中 |
| START_PENDING |
起動中(処理中) |
| STOP_PENDING |
停止処理中 |
| PAUSED |
一時停止中 |
サービスを再起動する
Windows の sc コマンドには直接の再起動オプションがないため、stop → start の組み合わせで実装します。
restart-service.bat
@echo off
setlocal
set SVC=W3SVC
echo サービスを停止しています...
net stop "%SVC%"
:: net stop は完了まで待機するのでそのまま start を実行できる
echo サービスを起動しています...
net start "%SVC%"
if %ERRORLEVEL% NEQ 0 (
echo エラー: サービスの起動に失敗しました。
exit /b 1
)
echo 再起動完了: %SVC%
endlocal
サービスの自動起動を設定・解除する
sc config でサービスのスタートアップ種類(自動・手動・無効)を変更できます。
sc-config.bat
:: 自動起動に設定(OS 起動時に自動でサービス起動)
sc config Spooler start= auto
:: 手動起動に設定(手動 or sc start でのみ起動)
sc config Spooler start= demand
:: 無効に設定(起動不可)
sc config Spooler start= disabled
:: 遅延自動起動(OS 起動後しばらくしてから自動起動)
sc config Spooler start= delayed-auto
サービスが存在するか確認してから操作する
サービスが存在しない状態で起動・停止しようとするとエラーになります。事前に存在確認を行うのが実務でのベストプラクティスです。
check-and-start.bat
@echo off
setlocal
set SVC=MyAppService
:: sc query でサービスの存在確認(存在しない場合 ERRORLEVEL=1060)
sc query "%SVC%" >nul 2>&1
if %ERRORLEVEL% NEQ 0 (
echo エラー: サービス "%SVC%" が見つかりません。
exit /b 1
)
:: サービスの状態が RUNNING かどうか確認
sc query "%SVC%" | find "RUNNING" >nul
if %ERRORLEVEL% EQU 0 (
echo %SVC% はすでに起動中です。
) else (
echo %SVC% を起動します...
net start "%SVC%"
)
endlocal
実務パターン集
IIS を再起動する
restart-iis.bat
@echo off
:: iisreset コマンドで IIS 全体をリセット(推奨)
iisreset /restart
:: または W3SVC(WWW Publishing Service)を再起動
net stop W3SVC
net start W3SVC
echo IIS 再起動完了
SQL Server を再起動する
restart-sqlserver.bat
@echo off
:: デフォルトインスタンスの場合は MSSQLSERVER
:: 名前付きインスタンスの場合は MSSQL$インスタンス名
set SVC=MSSQLSERVER
net stop "%SVC%"
net start "%SVC%"
echo SQL Server 再起動完了
サービス監視と自動復旧
service-watchdog.bat
@echo off
setlocal
set SVC=MyAppService
set LOG=C:Logswatchdog.log
:: サービスが RUNNING でなければ自動起動
sc query "%SVC%" | find "RUNNING" >nul
if %ERRORLEVEL% NEQ 0 (
echo %DATE% %TIME% - %SVC% が停止中。再起動します。 >> "%LOG%"
net start "%SVC%"
) else (
echo %DATE% %TIME% - %SVC% 正常稼働中 >> "%LOG%"
)
endlocal
ポイント:このバッチをタスクスケジューラで5分ごとに実行すると、簡易的なサービス監視が実現できます。本格的な監視には Windows のサービス回復オプション(sc failure)や専用の監視ツールを併用するとよいでしょう。
よくある失敗例と対処法
| エラー・問題 |
原因・対処法 |
| アクセスが拒否されました |
管理者権限が必要。バッチを右クリック→「管理者として実行」するか、タスクスケジューラで「最上位の特権で実行する」にチェックを入れる |
| 指定されたサービスは存在しません |
サービス名(短い名前)が間違っている。services.msc でサービスのプロパティを開き「サービス名」を確認する |
| sc config の = の後にスペースが必要 |
start=auto ではなく start= auto(= の後にスペース)が正しい構文 |
| net stop が応答しない |
サービスが停止処理に時間がかかっている。sc stop + timeout /t 10 で待機してから次の処理に進む |
| サービス名が不明 |
sc query type= service state= all で一覧を取得するか、services.msc でプロパティを確認する |
FAQ
❓ net start と sc start はどちらを使えばよいですか? (クリックで開閉)
起動・停止だけが目的なら net start/stop のほうがシンプルで読みやすいです。サービスの状態確認・設定変更・存在チェックなど高度な操作が必要な場合は sc コマンドを使います。また net stop は完了まで待機するのに対し、sc stop は非同期のため、順序が重要なバッチでは net stop のほうが安全です。
❓ サービス名を調べる方法を教えてください。 (クリックで開閉)
3つの方法があります。①services.msc(サービス管理画面)でサービスをダブルクリックし「全般」タブの「サービス名」を確認。②sc query type= service state= all でコマンドラインから一覧取得。③タスクマネージャーの「サービス」タブで確認。表示名(Display Name)とサービス名(Service Name)は異なる場合が多いので、必ずサービス名を使ってください。
❓ タスクスケジューラからサービス操作バッチを実行する際の注意点は? (クリックで開閉)
タスクスケジューラでサービス操作バッチを実行する場合は、必ず「最上位の特権で実行する(UAC昇格)」にチェックを入れてください。また「ユーザーがログオンしているかどうかにかかわらず実行する」を選択するとバックグラウンドで確実に実行されます。実行アカウントは Administrators グループのユーザーを指定してください。