使用sc.exe创建服务时如何传递上下文参数?
问题的原因是在使用sc.exe创建服务时,如何传递上下文参数。在上述代码中,创建了一个名为"YOURSERVICENAME"的服务,但没有提供上下文参数。
解决方法如下:
1. 使用sc.exe时,在binpath参数中包含所有必需的上下文参数。例如,可以使用以下命令来创建一个包含上下文参数的服务:
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH -cPARAM1 -dPARAM2" start= auto
在上述命令中,-cPARAM1和-dPARAM2是两个示例上下文参数。
2. 参考上述代码中提供的链接,了解如何修改现有服务的可执行文件路径。在这个问题中,可能需要修改现有服务的可执行文件路径,以包含所需的上下文参数。
通过以上方法,可以在使用sc.exe创建服务时传递上下文参数。
当使用sc.exe创建服务时,如何传入上下文参数?
创建的服务的参数有一些特殊的格式问题,特别是如果命令中包含空格或引号:
如果要为服务输入命令行参数,必须用引号将整个命令行括起来。 (并且始终在binPath=
之后和第一个引号之前留有一个空格,正如mrswadge所指出的那样)
因此,要为命令PATH\COMMAND.EXE --param1=xyz
创建服务,您将使用以下binPath参数:
binPath= "PATH\COMMAND.EXE --param1=xyz" ^^ ^ || | 空格 引号 引号
如果可执行文件的路径包含空格,则必须用引号将路径括起来。
因此,对于同时具有参数和带有空格的路径的命令,您需要嵌套引号。
您必须使用反斜杠\"转义内部引号。如果参数本身包含引号,您也需要转义这些引号。
尽管使用反斜杠作为转义字符,但您不必转义路径中包含的常规反斜杠。这与通常使用反斜杠作为转义字符的方式相反。
因此,对于像这样的命令
"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" ^ ^ ^ ^ ^ ^ ^ | | | | | | | 开始引号 转义引号 常规反斜杠 转义引号 转义引号 结束引号 对于 对于 在 结束引号 对于 对于 整个命令 整个命令
下面是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中的所有反斜杠不进行转义
我发现确保在binPath=和值"myservice.exe"之间有一个空格很重要,即binPath= "myservice.exe
。命令行解释器必须期望这样做,并要求使用空格作为分隔符将命令进行标记化。
我尝试了这种方法,它有效。SC.EXE "\\ServerName" Create "ServiceName" BinPath="SampleService.exe"
这应该在sc.exe create
的MS文档中。
这个空格仍然相关吗?现在它可以无空格工作。我正在使用Windows 10。
当使用sc.exe创建服务时,如何传递上下文参数?
创建服务的命令是sc create
技巧在于在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
如果成功,您应该会看到:
[SC] CreateService SUCCESS
更新1:
http://support.microsoft.com/kb/251192
请记住binPath=后面的空格(binPath= "C:\...")必须存在,否则无法正常工作。
-Knight 空格正是我丢失的部分。非常感谢!
start= auto是一个重要的设置,这样在重启后,服务将自动启动。这对于非专家用户非常有用。
如果您需要在binPath中传递需要引号的额外参数,它们必须被转义(例如:如果路径是c:\some long path\some.exe "first argument",则需要使用binPath= "\"c:\some long path\some.exe\" \"first argument\"")。
如果在参数(binPath= ...和DisplayName= ...)后面没有空格(例如在我的情况下,我忘记在DisplayName后面加上等号),控制台将打印create命令的用法说明,如:DESCRIPTION: Creates a service entry... USAGE: sc
在我的情况下,我需要以管理员模式打开控制台,否则会出现"Access denied"。
等号后面的空格非常重要。
很好的答案。最棘手的部分是使用"\\"作为转义符号。
值得注意的是,该命令仅适用于Windows Server(和一些较旧的Windows版本)。Windows 10也有一个sc命令,但它是不同的,不能用于注册服务。