1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[C#/C++] サービスを作るうえで便利なコマンド

Last updated at Posted at 2021-04-12

サービス関連記事

やりたいこと

下記で、C++とC#で、Windowsのサービスを作成した。

C++
https://qiita.com/tera1707/items/8f4246a5666a01134b59

C#
https://qiita.com/tera1707/items/47335420a1a91e2eaa4a

サービスは、ビルドしてexeが出来上がっても、そのままVisualStdio2019でF5を押して実行、とかはできない。
いったんサービスとしてPCにインストールして、そのサービスを「開始」したうえで、VisualStudioから「アタッチ」しないといけない。

そのインストールなどなどをするときに、scコマンドを使うのだが、速攻で忘れてしまいそうなので、使いそうなコマンドを下記に全部まとめておきたい。

使えそうなコマンドを一個にまとめたbat

使えそうなコマンドを全部まとめた.bat

@echo off

set SERVICENAME="SvcName"
set SERVICEDISPNAME=%SERVICENAME%
set BINPATH=C:\Users\username\Desktop\test\serviceJikken1\Debug\serviceJikken1.exe
set DISCRIPTION="Svc Description..."

rem サービスのプロセスを無理やり終了させる
taskkill /f /im %BINPATH%

rem サービスをアンインストール
sc delete %SERVICENAME%
pause

rem サービスをインストール
rem 試した限り、binPathにはフルパスを指定しないとうまくいかない
sc create %SERVICENAME% start=auto binPath= %BINPATH% DisplayName= %SERVICEDISPNAME%
pause

rem 説明文を編集
sc description %SERVICENAME% %DISCRIPTION%
pause

rem サービスをスタート
rem sc start %SERVICENAME%
net start %SERVICENAME%
pause

rem サービスをストップ
sc stop %SERVICENAME%
pause

コードをビルドしなおして、そいつでサービスを作り直してサービススタート

サービスを作っている最中に、コードをちょっと直したときに、いったんサービスをstopして、ビルドしなおして、サービス作り直して再度スタートさせて、、、とやっていると非常にめんどくさいので、下記のようなbatを作って簡単にビルド→サービス再起動までできるようにしておけば便利かもしれない。

ビルドしなおして再スタート.bat

@echo off

set SOLUTIONPATH="C:\Users\username\Desktop\test\serviceJikken1\serviceJikken1.sln"

set SERVICENAME="SvcName"
set SERVICEDISPNAME=%SERVICENAME%
set BINPATH=C:\Users\username\Desktop\test\serviceJikken1\Debug\serviceJikken1.exe
set DISCRIPTION="Svc Description..."

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat"

echo -サービスのプロセスを無理やり終了させる
taskkill /f /im %BINPATH%

echo -サービスをアンインストール
sc delete %SERVICENAME%

echo -ソリューションをリビルドする
MSBuild %SOLUTIONPATH% /t:clean;rebuild /p:Configuration=Debug;Platform="x86" > nul
if %ERRORLEVEL% neq 0 (
    echo ErrorLevel:%ERRORLEVEL%
    echo ビルド失敗
    pause
    exit
)

echo -サービスをインストール
rem 試した限り、binPathにはフルパスを指定しないとうまくいかない
sc create %SERVICENAME% start=auto binPath= %BINPATH% DisplayName= %SERVICEDISPNAME%

echo -説明文を編集
sc description %SERVICENAME% %DISCRIPTION%

echo -サービスをスタート
rem sc start %SERVICENAME%
net start %SERVICENAME%
pause

プロセス名からサービス名を調べる

コマンドではないが、下記のようにすると、プロセス名だけわかっているときに、そのプロセスが何のサービスとして動いているかを調べることができる。

例:私のPCで動いている「MicronCacheMonitor.exe」は何のサービスか調べる

タスクマネージャーを開いて、「詳細」タブで、そのプロセス名を見つける。

そいつを右クリックして、「サービスの表示」を押す。

image.png

そうすると、同じタスクマネージャーの「サービス」タブで、そのサービスの名前が表示される。

image.png

scコマンドに渡すサービス名は、ここに出てるサービス名を指定してやればOK。

もしサービスの「表示名」が知りたければ、sc GetDisplayName サービス名 で取れる。

コマンド

sc GetDisplayName MicronCacheMonitor

結果

C:\Users\masa>sc GetDisplayName MicronCacheMonitor
[SC] GetServiceDisplayName SUCCESS
名前 = Micron SSD Cache Monitor

参考

scコマンド

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?