使用以下方法创建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
,但是我没有找到示例或能够成功做到这一点。
Answers:
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
诀窍是在您的create语句中,在=后面保留一个空格,并对包含特殊字符或空格的任何内容使用“”。
建议为服务指定一个显示名称,并将开始设置设置为自动,以使其自动启动。您可以通过在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
更新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....
等
用于创建的服务的参数存在一些特殊的格式问题,尤其是在命令包含空格或引号的情况下:
如果要输入服务的命令行参数,则必须将整个命令行用引号引起来。(并总是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创建“ YOURSERVICENAME” binpath =“ \” C:\ Program Files(x86)\ Microsoft SQL Server \ MSSQL11 \ MSSQL \ Binn \ sqlservr.exe \“ -sOPTIONALSWITCH” start = auto
请参见此处:修改Windows服务的“可执行文件的路径”
考虑如何在应用程序代码中访问参数也很重要。
在我的C#应用程序中,我使用了ServiceBase类:
class MyService : ServiceBase
{
protected override void OnStart(string[] args)
{
}
}
我使用以下方式注册了服务
sc创建myService binpath =“ MeyService.exe arg1 arg2”
但是args
当我将其作为服务运行时,无法通过变量访问参数。
MSDN文档建议不要使用Main方法来检索binPath
or 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,其中带有空格\ service_executable.exe \“”
换句话说,使用\可以避免在过渡到注册表后仍要保留的所有“”。
确保binPath值的开头和结尾都有引号。
binPath= "c:\abc\def.exe /Param1=ghi"
的想法似乎正确。是否需要转义反斜杠(即“ c:\\ abc \\ ...”)?最糟糕的是,如果SC.EXE无法执行此操作,则可以直接编辑注册表值。