Параметры для созданных сервисов имеют некоторые специфические проблемы с форматированием, в частности, если команда включает пробелы или кавычки:
Если вы хотите ввести параметры командной строки для службы, вы должны заключить всю командную строку в кавычки. (И всегда оставляйте пробел после binPath=
и перед первой цитатой, как указала миссис Уэдж)
Итак, чтобы создать службу для команды, PATH\COMMAND.EXE --param1=xyz
вы должны использовать следующий параметр binPath:
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
Если путь к исполняемому файлу содержит пробелы , вы должны заключить путь в кавычки.
Итак, для команды, которая имеет оба параметра и путь с пробелами, вам нужны вложенные кавычки . Вы должны избегать внутренних кавычек с помощью обратной косой черты \". То же самое верно, если сами параметры содержат кавычки, вам также нужно будет избегать их.
Несмотря на использование обратной косой черты в качестве escape-символов, вам не нужно избегать обычных обратных косых черт, содержащихся в пути. Это противоречит тому, как вы обычно используете обратную косую черту в качестве escape-символов.
Итак, для такой команды
"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
Вот конкретный пример из документации 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= "c:\abc\def.exe /Param1=ghi"
идея кажется правильной. Нужно ли экранировать обратную косую черту (например, "c: \\ abc \\ ...")? Хуже всего то, что вы могли напрямую редактировать значение реестра после этого, если SC.EXE не может этого сделать.