2009-02-24 171 views
14

我没有经验编写批处理脚本,但我想知道是否有方法使用installutil.exe使用这样的脚本安装.NET Windows服务,或者卸载服务如果它已被安装,理想情况下,我确实想要执行卸载(例如,按y卸载)。批处理脚本安装或卸载.NET Windows服务

这里还有一些细节:

  • 该服务的.exe文件位于C:\Program Files\Data Service目录
  • 脚本应该是在同一个目录中的.exe为服务
  • 会在服务安装完成后向日志文件中添加一条简单的行(我们将其称为program.log
  • 该计算机正在运行Windows Server 2003,并在默认目录中安装了.NET Framework C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

如果您认为这可以做得更好,那么听听其他建议会很好。我总是可以编写一个服务安装程序,但这不是优先事项。

回答

13

您可以使用命令行参数(-i -u等)设置您的服务exe以支持自注册/注销,而不是编写批处理文件来执行相同的操作。创建自安装服务在.NET

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

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

还加入了安装项目,以您的解决方案,并具有Visual Studio中建立一个安装包可能会更快

信息。

如何为Windows服务在Visual Basic .NET或Visual Basic 2005

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

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

+4

注意,微软删除Visual Studio中的安装项目类型2012 – 2013-05-06 15:44:08

0

建议创建安装项目:

  • 利用该环境,Windows可能不会安装在C:上。但是你可以使用%WinDir%。
  • 您可以重定向回声附加到文件:

    呼应的消息>> LOGFILE.TXT一切

  • 饲养跟踪和convering所有边缘的情况下可以在cmd.exe的是具有挑战性的,它并不是一个富有的环境。

  • 没有一致的文档记录。但是,对“cmd”,“if”,“for”,“set”和“call”的帮助(来自命令行)涵盖了很多可用的语法。
  • 在开始时设置回显以查看执行时的命令。
1

我不知道为什么你需要一个班轮的批处理文件。这是我会用的。

C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ InstallUtil.exe /我ServiceAssembly.dll

27

这是我用来安装批处理文件。

@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 

卸载我用下面的:

@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

谢谢...非常完美 – Lijo 2013-04-19 12:59:11

+3

当我在管理员模式下的`PATH`运行批处理文件指的是`C:\ Windows \ system32 \ service。exe`而不是文件实际存在的路径,为什么? – Anoop 2014-06-12 08:23:50

0

我这样做是有一个老式的批处理文件....

复制installutil.exe到同一目录作为您的可执行文件(使事情更容易)以下是批处理文件内容的一个通用示例:(我的名字是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 

有关为installutil.exe,see here命令行选项的详细信息。

要卸载服务,使用不同的批处理文件,其内容如下:


installutil MyService.exe /u 

0

创建一个文件扩展名为.bat,并将该文件

installutil在-uc:\ YourServiceLocation \ Service.exe

6

这是我使用的一个。我找到它并使用它。感谢创造者..

@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

只是做自我安装服务比较容易。一旦你实现了这个,你可以直接用(/ i或/ u开关)运行service exe,或者如果你愿意的话可以把这个调用包装在一个批处理文件中。

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); 
    } 
} 
4

我发现使用批处理文件安装应用程序的好安装项目总是会更好。有些时候,那是无法完成的。工作中的几个项目是在Windows NT和早期的Windows XP中编写的,并且使用简单的批处理文件进行安装。在那段时间,将批处理文件转换为安装打包比单纯调整更麻烦。通过大量搜索,我发现http://ss64.com/nt/是一个很好的Windows批处理文件参考。 (只是感觉很奇怪,随着软件技术的进步,我们必须写出最后一句话。)

无论如何,快乐编码! - 不管“语言”。

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 

运行这个批处理文件以管理员身份