以下を使用してWindowsサービスを作成する場合:
sc create ServiceName binPath= "the path"
引数をInstallerクラスのContext.Parametersコレクションに渡すにはどうすればよいですか?
sc.exe
ドキュメントを読んだところ、そのような引数はの最後にしか渡せなかったとのことですがbinPath
、例を見つけられなかったか、これを正常に実行できませんでした。
以下を使用してWindowsサービスを作成する場合:
sc create ServiceName binPath= "the path"
引数をInstallerクラスのContext.Parametersコレクションに渡すにはどうすればよいですか?
sc.exe
ドキュメントを読んだところ、そのような引数はの最後にしか渡せなかったとのことですがbinPath
、例を見つけられなかったか、これを正常に実行できませんでした。
回答:
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
コツは、createステートメントの=の後にスペースを残し、特殊文字やスペースを含むものには ""を使用することです。
サービスの表示名を指定し、開始設定をautoに設定して、自動的に開始することをお勧めします。あなたは指定することによってこれを行うことができます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
アップデート1
binPath= "C:\..."
)の後のスペースが存在する必要があることに注意してください。そうしないと、これは機能しません。
start= auto
は重要なものであるため、再起動後にサービスが自動的に開始されます。エンドユーザーがエキスパートでない場合に非常に良い
binPath
引用符が必要な追加のパラメーターを渡す必要がある場合は、エスケープする必要があります(\"
)の例:パスである場合は、次のようc:\some long path\some.exe "first argument"
にする必要がありますbinPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
およびDisplayName= ...
;私の場合、DisplayNameの後に「=」を忘れた場合)、コンソールはcreate
コマンドの使用方法を出力します。例:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etc
作成されたサービスのパラメーターには、特にコマンドにスペースまたは引用符が含まれている場合、いくつかの特有のフォーマットの問題があります。
サービスのコマンドラインパラメータを入力する場合は、コマンドライン全体を引用符で囲む必要があります。(そしてbinPath=
、mrswadgeが指摘したように、常に最初の引用の前後にスペースを残してください)
したがって、コマンドのサービスを作成するにPATH\COMMAND.EXE --param1=xyz
は、次のbinPathパラメータを使用します。
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
実行可能ファイルへのパスにスペースが含まれている場合は、パスを引用符で囲む必要があります。
したがって、パラメーターとスペースを含むパスの両方を含むコマンドの場合、ネストされた引用符が必要です。バックスラッシュで内側の引用符をエスケープする必要があります。パラメータ自体に引用符が含まれている場合も同様です。引用符もエスケープする必要があります。\"
エスケープ文字としてバックスラッシュを使用しているにもかかわらず、パスに含まれている通常のバックスラッシュをエスケープする必要はありません。これは、通常バックスラッシュをエスケープ文字として使用する方法とは逆です。
したがって、次のようなコマンドの場合
"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=_
binPath= "myservice.exe
。コマンドラインインタープリターはこれを予期し、スペースを区切り文字として使用してコマンドをトークン化する必要があります。
sc create "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"
ありました。渡した最初の引数を無視するようだったので、使用して機能しました。
このコマンドは機能します:
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:\ path with it with service \ service_executable.exe \ ""
言い換えると、\を使用して、レジストリへのトランジットを生き残るために必要なすべての「」をエスケープします。
binPath= "c:\abc\def.exe /Param1=ghi"
は正しい考えのように見えます。バックスラッシュはエスケープする必要がありますか(例: "c:\\ abc \\ ...")?最悪の場合、SC.EXEで編集できない場合は、後でレジストリ値を直接編集できます。