Windowsサービスを作成する場合
sc create ServiceName binPath= "the path"
どのように引数をインストーラクラスのContext.Parametersコレクションに渡すことができますか?
私はsc.exe
のドキュメントを読んでいますが、そのような引数はbinPath
の最後にしか渡すことができませんでしたが、例が見つからないか、これを正常に実行できませんでした。
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
トリックは、createステートメントの=の後にスペースを入れ、特殊文字またはスペースを含むものには ""を使用することです。
自動的に起動するように開始設定をautoに設定するだけでなく、サービスの表示名を指定することをお勧めします。これを行うには、createステートメントでDisplayName= yourdisplayname
とstart= auto
を指定します。
これが一例です。
C:\Documents and Settings\Administrator> sc create asperacentral
binPath= "C:\Program Files\Aspera\Enterprise Server\bin\Debug\asperacentral.exe"
DisplayName= "Aspera Central"
start= auto
これがうまくいったらあなたは見るべきである:
[SC] CreateService SUCCESS
UPDATE 1
特にコマンドにスペースや引用符が含まれている場合、作成されたサービスのパラメータには、特有の形式上の問題があります。
サービスにコマンドラインパラメータを入力する場合は、コマンドライン全体を引用符で囲む必要があります。 (mrswadgeが指摘したように、binPath=
の後で最初の引用符の前には常にスペースを空けてください)
したがって、コマンドPATH\COMMAND.EXE --param1=xyz
のサービスを作成するには、次のbinPathパラメータを使用します。
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
実行可能ファイルへのパススペースを含むの場合は、pathを引用符で囲む必要があります。
したがって、both parameters andスペースを含むパスを持つコマンドの場合は、ネストした引用符が必要です。内側の引用符はバックスラッシュでエスケープする必要があります \"。パラメータ自体に引用符が含まれている場合も同じことが言えますが、それらもエスケープする必要があります。
円記号をエスケープ文字として使用しているにもかかわらず、パスに含まれている通常の円記号をエスケープする必要はありません。これは、バックスラッシュをエスケープ文字として通常使用する方法とは反対です。
だから、のようなコマンドのために"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:
binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"a b c\" --param2"
^ ^ ^ ^ ^ ^ ^
| | | | | | |
opening escaped regular escaped escaped closing
quote quote backslash closing quotes quote
for for in quote for for
whole path path for path parameter whole
command command
これはSVNserveのドキュメントからの具体的な例で、すべての特別な場合を示しています。
sc create svnserve
binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\" "
displayname= "Subversion Server" depend= Tcpip start= auto
(改行は読みやすくするために追加されています。含めないでください)
これにより、コマンドライン"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
で新しいサービスが追加されます。
binpath=_
、displayname=_
およびdepend=_
sc "YOURSERVICENAME" binpath = "\" C:\ Program Files(x86)\ Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\"-sopTIONALSWITCH" start = auto
こちらを参照してください。 Windowsサービスの「実行ファイルへのパス」を変更する
私はこれをWindows 7上で動作させるのに問題がありました。それは私が渡した最初の引数を無視するように見えたので、私はbinPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
を使いました。
私は単にパラメータなしでそれを作成し、それからレジストリHKLM\System\CurrentControlSet\Services\[YourService]
を編集するために使います。
このコマンドは機能します。
sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto
アプリケーションのコードでどのように引数にアクセスするかを考慮に入れることも重要です。
私のc#アプリケーションでは、ServiceBaseクラスを使用しました。
class MyService : ServiceBase
{
protected override void OnStart(string[] args)
{
}
}
を使って私のサービスを登録しました
sc create myService binpath = "MeyService.exe arg1 arg2"
しかし、サービスとして実行すると、args
変数を介して引数にアクセスできませんでした。
MSDNのドキュメントでは、Mainメソッドを使用してbinPath
またはImagePath
引数を取得しないことを推奨しています。代わりに、ロジックをOnStart
メソッドに配置してから(C#)Environment.GetCommandLineArgs();
を使用することをお勧めします。
最初の引数arg1
にアクセスするには、次のようにします。
class MyService : ServiceBase
{
protected override void OnStart(string[] args)
{
log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]);
}
}
これは印刷されます
arg1 == arg1
私はscを使う方法を見つけました。
sc config binPath = "\" c:\スペースが入ったパス\ service_executable.exe\""
言い換えれば、\を使ってレジストリへのトランジットを生き残りたいものをエスケープします。
私はあなたの提案でこの問題に対処することができませんでした、それは環境変数を使用してそれがパワーシェル(ウィンドウズサーバー2012)でのみ働いたx86フォルダーで最後に:
{sc.exe create svnserve binpath= "${env:programfiles(x86)}/Subversion/bin/svnserve.exe --service -r C:/svnrepositories/" displayname= "Subversion Server" depend= Tcpip start= auto}
上記のすべてを試してもまだサービスに引数を渡すことができない場合、サービスがC/C++で記述されていると、問題が発生する可能性があります。「sc start arg1 arg2 ...」でサービスを開始した場合、SCはあなたのサービスのServiceMain関数をそれらの引数で直接呼び出します。しかし、Windowsがサービスの起動時(たとえばブート時)に起動すると、レジストリの "binPath"からのパラメータを使用して、サービスのメイン関数(_tmain)が呼び出されます。
多くの二重引用符でバックスラッシュを使用するサービス作成の例。
C:\Windows\system32>sc.exe create teagent binpath= "\"C:\Program Files\Tripwire\TE\Agent\bin\wrapper.exe\" -s \"C:\Program Files\Tripwire\TE\Agent\bin\agent.conf\"" DisplayName= "Tripwire Enterprise Agent"
[SC] CreateService SUCCESS
BinPath値の前後には必ず引用符を付けてください。