用sc.exe创build一个服务; 如何传递上下文参数
当使用sc创buildServiceName binPath =“path”时,参数如何传递给Installer类的Context.Parameters集合?
我读到的sc.exe文件是这样的参数只能在binPath的末尾传递,但我还没有find一个例子或能够成功地做到这一点。
 sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN] 
诀窍是在创build语句中的=之后留出空格,并且也可以使用“”来包含特殊字符或空格。
 build议为服务指定显示名称,并将启动设置设置为自动,以便自动启动。 你可以通过在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
创build服务的参数有一些特殊的格式化问题,特别是如果命令包含空格或引号:
 如果要input服务的命令行参数 ,则必须将整个命令行用引号引起来。  (在binPath=和第一个引号之前总是留出一个空格,就像mrswadge指出的那样) 
 因此,要为命令PATH\COMMAND.EXE --param1=xyz创build一个服务PATH\COMMAND.EXE --param1=xyz您可以使用以下binPath参数: 
 binPath= "PATH\COMMAND.EXE --param1=xyz" ^^ ^ || | space quote quote 
如果可执行文件的path 包含空格 ,则必须将该path放在引号中。
因此,对于具有空格的参数和path的命令,您需要嵌套的引号 。 你必须使用反斜杠来转义内部引号。如果参数本身包含引号,也是一样的,你也需要把它们转义出来。
尽pipe使用反斜杠作为转义字符,您不必转义path中包含的常规反斜杠。 这与通常使用反斜杠作为转义字符相反。
 所以对于一个类似的命令 
  "PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="abc" --param2 : 
 binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"abc\" --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创build“YOURSERVICENAME”binpath =“\”C:\ Program Files(x86)\ Microsoft SQL Server \ MSSQL11 \ MSSQL \ Binn \ sqlservr.exe \“-sOPTIONALSWITCH”start = auto
请参阅: 修改Windows服务的“可执行文件的path”
 我有问题得到这个在Windows 7上工作。它似乎忽略了我传入的第一个参数,所以我用binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2" ,它的工作。 
 我用它来创build它没有参数,然后编辑registryHKLM\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创buildmyService binpath =“MeyService.exe arg1 arg2”
 但是当我把它作为服务运行时,我无法通过argsvariables访问参数。 
  MSDN文档build议不要使用Main方法来检索binPath或ImagePath参数。 相反,它build议将您的逻辑放在OnStart方法,然后使用(C#) Environment.GetCommandLineArgs();  。 
 要访问第一个参数arg1我需要这样做: 
 class MyService : ServiceBase { protected override void OnStart(string[] args) { log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]); } } 
这将打印
  arg1 == arg1 
请确保在binPath值的开始和结尾处有引号。
我find了一个使用sc的方法。
sc config binPath =“\”c:\ path中有空格\ service_executable.exe \“”
换句话说,使用\来逃避任何你想要生存的过渡到registry。
我无法处理与您的提案的问题,最后与x86文件夹,它只能在使用环境variables的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} 
如果您尝试了上述所有内容,仍然无法将parameter passing给您的服务,如果您的服务是使用C / C ++编写的,则可能会出现以下问题:当您通过“sc start arg1 arg2 …”启动服务时, SC使用这些参数直接调用你的服务的ServiceMain函数。 但是,当Windows启动你的服务时(例如在启动时),这是你的服务的主要function(_tmain)被调用,从registry的“binPath”PARAMS。