创建 Windows 服务时使用:
sc create ServiceName binPath= "the path"
如何将参数传递给 Installer 类的 Context.Parameter 集合?
我对 sc.exe文档的理解是,这样的参数只能在 binPath的末尾传递,但是我没有找到一个示例,也没有能够成功地做到这一点。
sc.exe
binPath
确保在 binPath 值的开头和结尾都有引号。
在 Windows7上运行这个程序时,我遇到了一些问题。它似乎忽略了我传入的第一个参数,所以我使用了 binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2",它起作用了。
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]
诀窍是在 create 语句的 = 后面留一个空格,并且对任何包含特殊字符或空格的内容使用“”。
建议为服务指定一个 Display Name,并将开始设置设置为 auto,以便自动启动。可以通过在 create 语句中指定 DisplayName= yourdisplayname和 start= auto来实现这一点。
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
Http://support.microsoft.com/kb/251192
创建的服务的参数有一些特殊的格式问题,特别是如果命令包含空格或引号:
如果要为服务输入 命令行参数命令行参数,则必须在 整个命令行中加引号。(正如 mrswadge 所指出的,在 binPath=之后和第一个引用之前要留出空格)
binPath=
因此,要为命令 PATH\COMMAND.EXE --param1=xyz创建服务 您将使用以下 binPath 参数:
PATH\COMMAND.EXE --param1=xyz
binPath= "PATH\COMMAND.EXE --param1=xyz" ^^ ^ || | space quote quote
如果 路径指向可执行文件 包含空格,则必须将 路径引号括起来。
因此,对于具有 都有参数 还有和带空格的路径的命令,您需要 嵌套的引用。 必须用反斜杠 \"转义内引号。如果参数本身包含引号,也需要转义这些引号。
尽管使用反斜杠作为转义字符,但您不必转义路径中包含的常规反斜杠。这与您通常使用反斜杠作为转义字符的方式相反。
所以像这样的命令 返回文章页面
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
下面是 SVNserver 文档中的一个具体例子,它显示了所有特殊情况:
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"添加一个新服务。
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
binpath=_
displayname=_
depend=_
我用来只是创建它没有参数,然后编辑注册表 HKLM\System\CurrentControlSet\Services\[YourService]。
HKLM\System\CurrentControlSet\Services\[YourService]
我无法处理你的提案中的问题,在 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}
这个命令有效:
sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto
我找到了一种使用 sc 的方法。
Sc config binPath = ““ c: path with space in it service _ Executive. exe””
换句话说,用来转义任何你想存活到注册表中的过境。
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto
看这里: 修改 Windows 服务的“可执行路径”
如果你尝试了以上所有方法仍然不能将 args 传递给你的服务,如果你的服务是用 C/C + + 编写的,那么问题就来了: 当你通过“ SC start arg1 arg2...”启动你的服务时,SC 直接用这些 args 调用你服务的 ServiceMain 函数。但是当 Windows 启动您的服务时(例如,在启动时) ,调用的是您的服务的主函数(_ tmain) ,其参数来自注册表的“ binPath”。
考虑如何访问应用程序代码中的参数也很重要。
在我的 c # 应用程序中,我使用了 ServiceBase 类:
class MyService : ServiceBase { protected override void OnStart(string[] args) { } }
我注册了我的服务
Sc create myService binpath = “ MeyService.exe arg1 arg2”
但是当我将它作为服务运行时,我无法通过 args变量访问这些参数。
args
MSDN 文档建议不要使用 Main 方法检索 binPath或 ImagePath参数。相反,它建议将逻辑放在 OnStart方法中,然后使用(C #) Environment.GetCommandLineArgs();。
ImagePath
OnStart
Environment.GetCommandLineArgs();
要访问第一个参数 arg1,我需要这样做:
arg1
class MyService : ServiceBase { protected override void OnStart(string[] args) { log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]); } }
这个会打印出来
arg1 == arg1
使用带有许多双引号的反斜杠的服务创建示例。
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
它在 Powershell 不起作用,对我来说应该使用 CMD
在 W2008服务器中你仍然需要空间,例如 binPath= "",但是在 W2019服务器中它是 修好了,而 binPath=""工作
binPath= ""
binPath=""