Os parâmetros para serviços criados têm alguns problemas de formatação peculiares, principalmente se o comando incluir espaços ou aspas:
Se você deseja inserir parâmetros de linha de comando para o serviço, é necessário colocar a linha de comando inteira entre aspas. (E sempre deixe um espaço binPath=
antes e depois da primeira cotação, como mrswadge apontou)
Portanto, para criar um serviço para o comando, PATH\COMMAND.EXE --param1=xyz
você usaria o seguinte parâmetro binPath:
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
Se o caminho para o executável contiver espaços , você deverá colocar o caminho entre aspas.
Assim, por um comando que tem ambos os parâmetros e um caminho com espaços, você precisa de aspas aninhadas . Você precisa escapar das aspas internas com barras invertidas\" . O mesmo vale se os próprios parâmetros contiverem aspas, você precisará escapar delas também.
Apesar de usar barras invertidas como caracteres de escape, você não precisa escapar das barras invertidas regulares contidas no caminho. Isso é contrário ao modo como você normalmente usa barras invertidas como caracteres de escape.
Portanto, para um comando como
"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
Aqui está um exemplo concreto da documentação do SVNserve, que mostra todos os casos especiais:
sc create svnserve
binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\" "
displayname= "Subversion Server" depend= Tcpip start= auto
(quebras de linha são adicionadas para facilitar a leitura, não as inclua)
Isso adicionaria um novo serviço com a linha de comando "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.
Então, em resumo
- espaço após cada parâmetro sc:
binpath=_
, displayname=_
edepend=_
- cada parâmetro sc que contém espaços deve ser colocado entre aspas
- todas as aspas adicionais dentro do caminho do bin são escapadas com barras invertidas: \"
- todas as barras invertidas dentro do caminho de bin não são escapadas
binPath= "c:\abc\def.exe /Param1=ghi"
a idéia certa. As barras invertidas precisam ser escapadas (ou seja, "c: \\ abc \\ ...")? Pior, você pode editar diretamente o valor do Registro posteriormente, se o SC.EXE não puder fazer isso.