使用以下方法创建Windows服务时:
sc create ServiceName binPath= "the path"
如何将参数传递给Installer类的Context.Parameters集合?
我对sc.exe
文档的阅读是这样的论证只能在binPath
的末尾传递,但我没有找到一个例子或者能够成功地做到这一点。
答案 0 :(得分:231)
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
诀窍是在create语句中的=后面留一个空格,并且对包含特殊字符或空格的任何内容使用“”。
建议为服务指定显示名称,并将开始设置设置为自动,以便自动启动。您可以通过在create statement中指定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
答案 1 :(得分:130)
创建服务的参数有一些特殊的格式问题,特别是如果命令包含空格或引号:
如果要为服务输入命令行参数,则必须将整个命令行括在引号中。 (并且总是在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=_
答案 2 :(得分:11)
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto
答案 3 :(得分:5)
我在Windows 7上运行时遇到了问题。它似乎忽略了我传入的第一个参数,因此我使用binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
并且它有效。
答案 4 :(得分:4)
我用它来创建没有参数的,然后编辑注册表HKLM\System\CurrentControlSet\Services\[YourService]
。
答案 5 :(得分:2)
此命令有效:
sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto
答案 6 :(得分:2)
考虑如何访问应用程序代码中的Arguments也很重要。
在我的c#应用程序中,我使用了ServiceBase类:
class MyService : ServiceBase
{
protected override void OnStart(string[] args)
{
}
}
我使用
注册了我的服务sc create myService binpath =&#34; MeyService.exe arg1 arg2&#34;
但是当我将其作为服务运行时,我无法通过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
答案 7 :(得分:1)
我找到了一种使用sc的方法。
sc config binPath =&#34; \&#34; c:\ path中包含空格\ service_executable.exe \&#34; &#34;
换句话说,使用\来逃避任何想要在转入注册表后继续存在的问题。
答案 8 :(得分:0)
确保在binPath值的开头和结尾都有引号。
答案 9 :(得分:0)
我无法处理您的提案的问题,最后使用x86文件夹它只能在电源shell(Windows Server 2012)中使用环境变量:
{sc.exe create svnserve binpath= "${env:programfiles(x86)}/subversion/bin/svnserve.exe --service -r C:/svnrepositories/" displayname= "Subversion Server" depend= Tcpip start= auto}
答案 10 :(得分:0)
如果您尝试了以上所有方法但仍然无法将args传递给您的服务,如果您的服务是用C / C ++编写的,那么可能就是问题所在:当您通过“sc start arg1 arg2”启动服务时。 ..“,SC直接用这些args调用你服务的ServiceMain函数。但是,当Windows启动您的服务时(例如,在启动时),它是您的服务的主要功能(_tmain)被调用,使用来自注册表的“binPath”的参数。
答案 11 :(得分:0)
使用反斜杠使用许多双引号的服务创建示例。
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
答案 12 :(得分:0)
它在Powershell中不起作用,在我的情况下应该使用CMD
答案 13 :(得分:0)
在 W2008 Server 中,您仍然需要空间,例如binPath= ""
,但在 W2019 Server 中已修复,binPath=""
有效