创建 Windows 服务时使用:

sc create ServiceName binPath= "the path"

如何将参数传递到 Installer 类的 Context.Parameters 集合?

我读到的 sc.exe 文档表明此类参数只能在末尾传递 binPath, ,但我还没有找到例子或能够成功地做到这一点。

有帮助吗?

解决方案

sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

诀窍是在=在创建语句中=之后留出空间,并为包含特殊字符或空格的任何东西使用“”。

建议为服务指定显示名称,并将开始设置设置为自动设置,以便自动启动。您可以通过指定来做到这一点 DisplayName= yourdisplaynamestart= 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

http://support.microsoft.com/kb/251192

其他提示

创建服务的参数具有一些特殊的表述问题,特别是如果命令包括空格或报价:

如果要输入 命令行参数 为了服务,您必须包装 整个命令行 用引号。 (并始终离开空间 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top