Ao criar o serviço do Windows usando:
sc create ServiceName binPath= "the path"
como os argumentos podem ser passados para a coleção Context.Parameters da classe Installer?
Minha leitura da sc.exe
documentação é que esses argumentos só poderiam ser passados no final de binPath
, mas não encontrei um exemplo ou consegui fazer isso com êxito.
windows-services
greg simpático
fonte
fonte
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.Respostas:
O truque é deixar um espaço após o = na instrução de criação e também usar "" para qualquer coisa que contenha caracteres ou espaços especiais.
É aconselhável especificar um Nome de exibição para o serviço, além de definir a configuração inicial como automática, para que inicie automaticamente. Você pode fazer isso especificando
DisplayName= yourdisplayname
estart= auto
em sua instrução create.Aqui está um exemplo:
Se isso funcionou, você deverá ver:
ATUALIZAÇÃO 1
http://support.microsoft.com/kb/251192
fonte
binPath= "C:\..."
) precisa estar presente ou isso não funcionará.start= auto
é importante, portanto, após a reinicialização, o serviço será iniciado automaticamente. Muito bom no caso do usuário final não é um especialistabinPath
que exigem aspas têm de ser escapado (\"
) exemplo: se o caminho erac:\some long path\some.exe "first argument"
que teria de serbinPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
eDisplayName= ...
; no meu caso, esqueci o "=" após DisplayName), o console imprimirá as instruções de uso docreate
comando; como:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcOs 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: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
:Aqui está um exemplo concreto da documentação do SVNserve, que mostra todos os casos especiais:
(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
binpath=_
,displayname=_
edepend=_
fonte
binPath= "myservice.exe
. O intérprete da linha de comando deve estar esperando isso e exigindo que o comando seja tokenizado usando espaço como delimitador.Veja aqui: Modificando o "Caminho para o executável" de um serviço do Windows
fonte
Eu tive problemas para fazer isso funcionar no Windows 7. Pareceu ignorar o primeiro argumento que eu passei, então usei
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
e funcionou.fonte
Eu uso apenas para criá-lo sem parâmetros e, em seguida, edito o registro
HKLM\System\CurrentControlSet\Services\[YourService]
.fonte
Este comando funciona:
fonte
Também é importante levar em consideração como você acessa os argumentos no código do aplicativo.
No meu aplicativo c #, usei a classe ServiceBase:
Registrei meu serviço usando
sc create myService binpath = "MeyService.exe arg1 arg2"
Mas não consegui acessar os argumentos através da
args
variável quando a executo como um serviço.A documentação do MSDN sugere não usar o método Main para recuperar os argumentos
binPath
ouImagePath
. Em vez disso, sugere colocar sua lógica noOnStart
método e usar (C #)Environment.GetCommandLineArgs();
.Para acessar os primeiros argumentos
arg1
, preciso fazer o seguinte:isso imprimiria
fonte
Eu encontrei uma maneira de usar sc.
sc config binPath = "\" c: \ caminho com espaços nele \ service_executable.exe \ ""
Em outras palavras, use \ para escapar dos "" que você deseja sobreviver ao trânsito para o registro.
fonte
Um exemplo de criação de serviço do uso de barras invertidas com muitas aspas duplas.
fonte
Certifique-se de ter aspas no início e no final do seu valor binPath.
fonte
Não consegui lidar com o problema com suas propostas; no final, com a pasta x86, ela só funcionava no power shell (windows server 2012) usando variáveis de ambiente:
fonte
Se você tentou todas as opções acima e ainda não consegue passar argumentos para o seu serviço, se o serviço foi escrito em C / C ++, eis o que poderia ser o problema: quando você inicia o serviço através de "sc start arg1 arg2 ..." , SC chama a função ServiceMain do seu serviço diretamente com esses argumentos. Mas quando o Windows inicia o serviço (no momento da inicialização, por exemplo), é chamada a principal função do serviço (_tmain), com parâmetros do "binPath" do registro.
fonte
não está funcionando no Powershell e deve usar o CMD no meu caso
fonte