サービスを操作するには net か sc コマンド
Windowsサービスの開始・終了をコマンドで行う場合にはnetコマンドかscコマンドを使います。これらの違いとしてそれぞれ下記のような違いあります。
・netコマンドは同期的
・scコマンドは非同期的
つまり、netコマンドは実行終了まで待つが、scコマンドは待たない。
・netコマンドはリモートのサービスは操作できない
・scコマンドはリモートOK
scでリモートのサービスを再起動(restart)したい
Jenkinsなど、別マシンからWindowsサービスを操作したいことがあると思います。
前述のとおり、リモートのサービスの場合scコマンドを使います。
ただ、scコマンドにはstartとstopしかなく
sc stop ServiceName
sc start ServiceName
と実行しても、scが非同期なので、stop処理が完全に終了する前に次のコマンド実行に流れてしまい、sc startコマンドの実行時点ではサービスが終了しきっていないというエラーになります。
sc stopを同期的に同期的に使用するためには、下記のように do-while ループを回し、その中で query の結果が STOPPED になるのを待ちます。
sc \\【IPアドレス】 stop 【サービス名】 :DoWhile sc sc \\【IPアドレス】 query 【サービス名】 | findstr STATE | findstr STOPPED if %ERRORLEVEL% EQU 0 goto DoWhileExit goto DoWhile :DoWhileExit sc \\【IPアドレス】 start 【サービス名】
cmd不便です。。
これでとりあえずしのぎました。
参考
7. バッチ処理とフローチャート
http://mapplio.info/flo/flo_lecture2/bat_charpter.html#do-while