题
创建 Windows 服务时使用:
sc create ServiceName binPath= "the path"
如何将参数传递到 Installer 类的 Context.Parameters 集合?
我读到的 sc.exe
文档表明此类参数只能在末尾传递 binPath
, ,但我还没有找到例子或能够成功地做到这一点。
解决方案
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
诀窍是在=在创建语句中=之后留出空间,并为包含特殊字符或空格的任何东西使用“”。
建议为服务指定显示名称,并将开始设置设置为自动设置,以便自动启动。您可以通过指定来做到这一点 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=
在第一个报价之前,正如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"
.
因此,总结
- 每个SC参数之后的空间:
binpath=_
,displayname=_
和depend=_
- 每个包含空间的SC参数都必须包含在报价中
- BinPath内部的所有其他引号都被反闪烁而逃脱: \"
- BinPath内部的所有反斜线都没有逃脱
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"
它起作用了。
我曾经仅在没有参数的情况下创建它,然后编辑注册表 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 创建 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 “”
换句话说,请使用逃脱任何您想在注册表中过渡的任何“您”。
请确保在BinPath值的开始和结尾都有报价。
我无法通过您的建议来处理问题,最后使用X86文件夹,它仅在Power 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}
如果您尝试了上述所有操作,但仍然无法将ARG传递给您的服务,如果您的服务是用C/C ++编写的,则可能是问题所在:当您通过“ SC Start start arg arg1 arg2 ...”开始服务时,SC直接将您的服务的服务人函数直接与这些ARG一起函数。但是,当Windows启动您的服务(例如在启动时间)时,它是您服务的主函数(_tmain),并带有注册表的“ BinPath”的参数。
服务创建的示例,其中使用了许多双引号的背斜线。
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