用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”
但是当我把它作为服务运行时,我无法通过args
variables访问参数。
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。