使用sc.exe创建服务时如何传入上下文参数?

sym*_*reg 137 windows-services

使用时创建Windows服务:

sc create ServiceName binPath= "the path"
Run Code Online (Sandbox Code Playgroud)

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

我对sc.exe文档的阅读是这样的论证只能在最后传递binPath,但我没有找到一个例子或者能够成功地做到这一点.

Mhm*_*hmd 246

sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
Run Code Online (Sandbox Code Playgroud)

诀窍是在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
Run Code Online (Sandbox Code Playgroud)

如果这有效,你应该看到:

[SC] CreateService SUCCESS
Run Code Online (Sandbox Code Playgroud)

更新1

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

  • 请记住,binPath =(`binPath ="C:\ ..."`)*之后的空格需要*存在,否则这将无效. (37认同)
  • 此外,如果你需要传递需要引号的`binPath`中的额外参数,它们必须被转义(`\"`)示例:如果路径是`c:\ some long path\some.exe"第一个参数"`it需要是`binPath ="\"c:\ some some path\some.exe \"\"第一个参数\""` (21认同)
  • “ =“之后的空格非常重要 (3认同)
  • `start= auto` 很重要,所以重启后服务会自动启动。非常好,以防最终用户不是专家 (2认同)
  • 如果您的参数中的“=”后面没有空格(例如“binPath= ...”和“DisplayName= ...”;在我的例子中,我忘记了 DisplayName 之后的“=”),那么控制台将打印`create`命令的使用说明;例如:“描述:创建服务条目...用法:sc &lt;server&gt; create...”等 (2认同)

Hug*_*une 145

创建的服务的参数有一些特殊的格式化问题,特别是如果命令包含空格或引号:

如果要输入服务的命令行参数,则必须将整个命令行括在引号中.(并且总是binPath=在第一次引用之前和之前留下一个空格,正如mrswadge指出的那样)

因此,要为命令创建服务,PATH\COMMAND.EXE --param1=xyz 您将使用以下binPath参数:

binPath= "PATH\COMMAND.EXE --param1=xyz"
        ^^                             ^
        ||                             |
  space    quote                     quote
Run Code Online (Sandbox Code Playgroud)

如果可执行文件的路径包含空格,则必须将路径括在引号中.

因此,对于具有命令参数,并用空格的路径,你需要嵌套引用.你必须用反斜杠转义内部引号\".如果参数本身包含引号,则同样成立,您也需要转义它们.

尽管使用反斜杠作为转义字符,但您不必转义路径中包含的常规反斜杠.这与通常使用反斜杠作为转义字符的方式相反.

所以对于像这样的命令
"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
Run Code Online (Sandbox Code Playgroud)

以下是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 
Run Code Online (Sandbox Code Playgroud)

(为了便于阅读,添加了换行符,不包括它们)

这将使用命令行添加新服务"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories".

所以总结一下

  • 每个SC参数后空间:binpath=_,displayname=_depend=_
  • 包含空格的每个sc参数必须用引号括起来
  • binpath中的所有其他引号都使用反斜杠进行转义: \"
  • binpath中的所有反斜杠都不会被转义

  • 我发现确保binPath =和值"myservice.exe"之间有一个空格非常重要.即`binPath ="myservice.exe`.命令行解释器必须期望这一点并要求命令通过使用空格作为分隔符来标记化. (7认同)
  • 这个间距仍然相关吗?现在没有它也能工作。我使用的是 Windows 10。 (2认同)

小智 11

sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

请参见此处:修改Windows服务的"可执行路径"


小智 5

我有问题让这个在Windows 7上工作.它似乎忽略了我传入的第一个参数,所以我使用binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"它并且它工作.