Параметры для созданных сервисов имеют некоторые специфические проблемы форматирования, в частности, если команда содержит пробелы или кавычки:
Если вы хотите ввести параметры командной строки для службы, вы должны заключить всю командную строку в кавычки. (И всегда оставляйте пробел после binPath=
и перед первой цитатой, как указала mrswadge)
Итак, чтобы создать сервис для команды 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 не экранированы