【bat】Windowsサービスを起動・停止する方法|net start/stop・sc コマンド完全解説

バッチファイルから Windows サービスを操作することは、システム管理の自動化において非常によく使われるパターンです。

IIS の再起動、SQL Server の停止、社内アプリのサービス起動など、手作業で行っていた操作をバッチ化することで作業ミスをなくし、タスクスケジューラと組み合わせることで完全自動化も可能です。

この記事では net start/stopsc コマンドの使い方、状態確認、自動起動設定、エラーハンドリングまで網羅的に解説します。

スポンサーリンク

net start / net stop の基本

net startnet 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 グループのユーザーを指定してください。