Al crear el servicio de Windows usando:
sc create ServiceName binPath= "the path"
¿Cómo se pueden pasar los argumentos a la colección Context.Parameters de la clase Installer?
Mi lectura de la sc.exe
documentación es que tales argumentos solo podrían pasarse al final binPath
, pero no he encontrado un ejemplo o no he podido hacerlo con éxito.
windows-services
Greg simpátrico
fuente
fuente
binPath= "c:\abc\def.exe /Param1=ghi"
parece la idea correcta. ¿Deben escaparse las barras invertidas (es decir, "c: \\ abc \\ ...")? Lo peor, puede editar directamente el valor del Registro después si SC.EXE no puede hacerlo.Respuestas:
El truco es dejar un espacio después de = en su declaración de creación, y también usar "" para cualquier cosa que contenga caracteres o espacios especiales.
Es recomendable especificar un Nombre para mostrar para el servicio, así como establecer la configuración de inicio en automático para que se inicie automáticamente. Puede hacerlo especificando
DisplayName= yourdisplayname
ystart= auto
en su declaración de creación.Aquí hay un ejemplo:
Si esto funcionó, debería ver:
ACTUALIZACIÓN 1
http://support.microsoft.com/kb/251192
fuente
binPath= "C:\..."
) debe estar presente, de lo contrario, esto no funcionará.start= auto
es importante, por lo que después de reiniciar el servicio se iniciará automáticamente. Muy bueno en caso de que el usuario final no sea un expertobinPath
que requieren comillas, deben escaparse (\"
) ejemplo: si la ruta fuerac:\some long path\some.exe "first argument"
, tendría que serlobinPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
yDisplayName= ...
; en mi caso olvidé el "=" después de DisplayName), la consola imprimirá las instrucciones de uso delcreate
comando; como:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcLos parámetros para los servicios creados tienen algunos problemas de formateo peculiares, en particular si el comando incluye espacios o comillas:
Si desea ingresar parámetros de línea de comando para el servicio, debe encerrar la línea de comando completa entre comillas. (Y siempre deje un espacio después
binPath=
y antes de la primera cita, como señaló mrswadge)Entonces, para crear un servicio para el comando
PATH\COMMAND.EXE --param1=xyz
, usaría el siguiente parámetro binPath:Si la ruta al ejecutable contiene espacios , debe encerrar la ruta entre comillas.
Así que por un comando que tiene dos parámetros y un camino con espacios, necesita comillas anidadas . Tienes que escapar de las comillas internas con barras invertidas \". Lo mismo ocurre si los parámetros en sí contienen comillas, también deberá escapar de ellos.
A pesar de utilizar las barras diagonales inversas como caracteres de escape, no tiene que escapar de las barras diagonales inversas normales contenidas en la ruta. Esto es contrario a la forma en que normalmente utiliza barras invertidas como caracteres de escape.
Entonces, para un comando como
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:Aquí hay un ejemplo concreto de la documentación de SVNserve, que muestra todos los casos especiales:
(se agregan saltos de línea para facilitar la lectura, no los incluya)
Esto agregaría un nuevo servicio con la línea de comando
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.Entonces en resumen
binpath=_
,displayname=_
ydepend=_
fuente
binPath= "myservice.exe
. El intérprete de línea de comando debe esperar esto y requerir que el comando se convierta en token utilizando el espacio como delimitador.Ver aquí: Modificación de la "Ruta al ejecutable" de un servicio de Windows
fuente
Tuve problemas para que esto funcionara en Windows 7. Parecía ignorar el primer argumento que transmití, así que lo usé
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
y funcionó.fuente
Solía crearlo sin parámetros y luego editar el registro
HKLM\System\CurrentControlSet\Services\[YourService]
.fuente
Este comando funciona:
fuente
También es importante tener en cuenta cómo accede a los Argumentos en el código de la aplicación.
En mi aplicación C # utilicé la clase ServiceBase:
Registré mi servicio usando
sc create myService binpath = "MeyService.exe arg1 arg2"
Pero no pude acceder a los argumentos a través de la
args
variable cuando lo ejecuté como un servicio.La documentación de MSDN sugiere no usar el método Main para recuperar los argumentos
binPath
oImagePath
. En cambio, sugiere colocar su lógica en elOnStart
método y luego usar (C #)Environment.GetCommandLineArgs();
.Para acceder a los primeros argumentos
arg1
tengo que hacer así:esto imprimiría
fuente
Encontré una manera de usar sc.
sc config binPath = "\" c: \ ruta con espacios en ella \ service_executable.exe \ ""
En otras palabras, use \ para escapar de cualquier "'s que desee para sobrevivir al tránsito hacia el registro.
fuente
Un ejemplo de creación de servicio del uso de barras invertidas con muchas comillas dobles.
fuente
Asegúrese de tener comillas al principio y al final de su valor binPath.
fuente
No pude manejar el problema con sus propuestas, al final con la carpeta x86 solo funcionó en Power Shell (Windows Server 2012) usando variables de entorno:
fuente
Si probó todo lo anterior y aún no puede pasar argumentos a su servicio, si su servicio fue escrito en C / C ++, esto es lo que podría ser el problema: cuando inicia su servicio a través de "sc start arg1 arg2 ..." , SC llama a la función ServiceMain de su servicio directamente con esos argumentos. Pero cuando Windows inicia su servicio (en el momento del arranque, por ejemplo), se llama a la función principal de su servicio (_tmain), con parámetros del "binPath" del registro.
fuente
no funciona en Powershell y debería usar CMD en mi caso
fuente