2009-02-24 32 views
14

No tengo experiencia en escribir scripts por lotes, pero me preguntaba si había una forma de instalar un servicio Windows .NET usando installutil.exe usando dicho script, o desinstalo el servicio si ya está instalado, idealmente con algún tipo de confirmación de que realmente me gustaría realizar la desinstalación (por ejemplo, presionar y para desinstalar).Batch Script para instalar o desinstalar un servicio Windows .NET

Éstos son algunos detalles:

  • El .exe para el servicio se encuentra en el directorio C:\Program Files\Data Service
  • La secuencia de comandos debe estar en el mismo directorio que el archivo .exe para el servicio
  • Sería sea ​​agradable agregar una línea simple a un archivo de registro (lo llamaremos program.log, también en este directorio) después de que se haya instalado el servicio
  • La máquina ejecuta Windows Server 2003 con .NET Framework instalado en el directorio predeterminado C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

Si cree que esto podría hacerse de una mejor manera, sería bueno escuchar otras sugerencias. Siempre podría escribir un instalador de servicio, pero eso no es una prioridad.

Respuesta

13

Puede configurar su exe de servicio para admitir el autoregistro/anulación de registro utilizando argumentos de línea de comandos (-i -u etc) en lugar de escribir un archivo por lotes para hacer lo mismo.

La información sobre la creación de servicios de alquiler Instalación En .NET

http://anotherlab.rajapet.net/2006/06/self-installing-services-in-net.html

http://www.gotnet.biz/WindowsServiceSelfInstaller.ashx

también la adición de un proyecto de instalación a su solución y con Visual Studio construir un paquete de instalación puede ser más rápido.

Como crear un proyecto de instalación para un servicio de Windows en Visual Basic .NET o en Visual Basic 2005

(VB) http://support.microsoft.com/kb/317421

(C#) http://support.microsoft.com/kb/816169

+4

Tenga en cuenta que Microsoft eliminó el tipo de proyecto de instalación en Visual Studio 2012. Gracias –

0

Sugerencias:

  • Haz uso del entorno, es posible que Windows no esté instalado en C :. Pero puedes usar% WinDir%.
  • Puede redirigir eco para anexar a un archivo:

    eco de un mensaje >> logfile.txt

  • un seguimiento de todo y convering todos los casos extremos puede ser un reto en cmd.exe, se no es un ambiente rico

  • No hay lugar constante para la documentación. Pero la ayuda (desde la línea de comandos) en "cmd", "si", "para", "establecer" y "llamar" cubre gran parte de la sintaxis de avaialble.
  • Desactive el eco al inicio para ver los comandos a medida que se ejecutan.
1

no estoy seguro de por qué necesitaría un archivo por lotes para un trazador de líneas. esto es lo que usaría.

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe/i ServiceAssembly.dll

27

Se trata de los archivos por lotes que utiliza para instalar.

@ECHO OFF 

REM The following directory is for .NET 2.0 
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v2.0.50727 
set PATH=%PATH%;%DOTNETFX2% 

echo Installing MyService... 
echo --------------------------------------------------- 
InstallUtil /i MyService.exe 
echo --------------------------------------------------- 
echo Done. 
pause 

desinstalar I utilizó la siguiente:

@ECHO OFF 

REM The following directory is for .NET 2.0 
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v2.0.50727 
set PATH=%PATH%;%DOTNETFX2% 

echo Uninstalling MyService... 
echo --------------------------------------------------- 
InstallUtil /u MyService.exe 
echo --------------------------------------------------- 
echo Done 
+0

... funcionó a la perfección – Lijo

+3

Cuando corro el archivo por lotes en el modo de administrador de un 'path' se refiere a 'C: \ Windows \ system32 \ service.exe' y no la ruta en la que realmente existe el archivo, ¿por qué? – Anoop

0

Lo hice con un viejo archivo por lotes moda ....

Copiar el installutil.exe en el mismo directorio que el ejecutable (para facilitar las cosas) El siguiente es un ejemplo genérico del contenido del archivo de proceso por lotes necesario: (el mío era simplemente nombres instal.bat)


installutil MyService.exe 
sc config MyService type= interact type= own 
sc failure MyService reset= 6000 actions= restart/5000/restart/5000/restart/5000 
sc start MyService 

Para obtener más información sobre las opciones de línea de comandos para installutil.exe, see here.

para desinstalar el servicio, utilice un archivo por lotes diferentes con el siguiente contenido:


installutil MyService.exe /u 

0

crear un archivo con la extensión .bat y colocar esto en el archivo

installutil -uc: \ YourServiceLocation \ Service.exe

6

Este es el que yo uso. Lo encontré y lo uso. Gracias al creador ..

@echo off 

SET PROG="YourServiceHere.exe" 
SET FIRSTPART=%WINDIR%"\Microsoft.NET\Framework\v" 
SET SECONDPART="\InstallUtil.exe" 
SET DOTNETVER=2.0.50727 
    IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install 
SET DOTNETVER=1.1.4322 
    IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install 
SET DOTNETVER=1.0.3705 
    IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install 
GOTO fail 
:install 
    ECHO Found .NET Framework version %DOTNETVER% 
    ECHO Installing service %PROG% 
    %FIRSTPART%%DOTNETVER%%SECONDPART% %PROG% 
    GOTO end 
:fail 
    echo FAILURE -- Could not find .NET Framework install 
:param_error 
    echo USAGE: installNETservie.bat [install type (I or U)] [application (.exe)] 
:end 
    ECHO DONE!!! 
    Pause 
22

Es más fácil simplemente hacer servicios de auto-instalación. Una vez que implemente esto, puede ejecutar el servicio exe directamente con el modificador (/ i o/u) o envolver la llamada en un archivo por lotes si lo desea.

static void Main(string[] args) 
{ 
    if (args.Length > 0) 
    { 
     //Install service 
     if (args[0].Trim().ToLower() == "/i") 
     { System.Configuration.Install.ManagedInstallerClass.InstallHelper(new string[] { "/i", Assembly.GetExecutingAssembly().Location }); } 

     //Uninstall service     
     else if (args[0].Trim().ToLower() == "/u") 
     { System.Configuration.Install.ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); } 
    } 
    else 
    { 
     System.ServiceProcess.ServiceBase[] ServicesToRun; 
     ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
    } 
} 
+1

Esta sugerencia es mucho más fácil que tener que mantener proyectos de configuración o secuencias de comandos por lotes. – Xorandor

+1

¡Tan simple! Gracias –

+1

¡Esta es una de las publicaciones más prácticas que he leído! – Force

4

He encontrado que siempre es mejor usar un buen proyecto de instalación que para usar archivos por lotes para instalar una aplicación. Aunque hay momentos en que eso no se puede hacer. Se escribieron varios proyectos en el trabajo en la época de Windows NT y principios de Windows XP y el uso de archivos por lotes simples para la instalación. Durante esos momentos, convertir el archivo por lotes a una instalación empaquetada es más un problema que un simple ajuste. A través de mucha búsqueda, he encontrado que http://ss64.com/nt/ es una muy buena referencia de archivos por lotes de Windows. (Simplemente se siente extraño, con todo nuestro avance en las tecnologías de software, tener que escribir esa última frase.)

De todos modos, feliz codificación! - independientemente del "idioma".

0
@echo off 

SET PROG="c:\YourServiceLocation\Service.exe" SET FIRSTPART=%WINDIR%"\Microsoft.NET\Framework\v" SET SECONDPART="\InstallUtil.exe" SET DOTNETVER=4.0.30319 IF EXIST %FIRSTPART%%DOTNETVER%%SECONDPART% GOTO install 

GOTO fail :install ECHO Found .NET Framework version %DOTNETVER% ECHO Installing service %PROG% %FIRSTPART%%DOTNETVER%%SECONDPART% %PROG% GOTO end :fail echo FAILURE -- Could not find .NET Framework install :param_error echo USAGE: installNETservie.bat [install type (I or U)] [application (.exe)] :end ECHO DONE!!! Pause 

ejecutar este archivo bat como administrador

Cuestiones relacionadas