【问题标题】:Batch Script to Install or Uninstall a .NET Windows Service用于安装或卸载 .NET Windows 服务的批处理脚本
【发布时间】:2009-02-24 18:16:36
【问题描述】:

我没有编写批处理脚本的经验,但我想知道是否有办法使用installutil.exe 使用这样的脚本来安装 .NET Windows 服务,或者如果已经安装了该服务,最好卸载某种服务确认我实际上想要执行卸载(例如按 y 卸载)。

这里有一些细节:

  • 服务的 .exe 位于 C:\Program Files\Data Service 目录中
  • 脚本应与服务的 .exe 位于同一目录中
  • 安装服务后,最好在日志文件中添加一个简单的行(我们称之为program.log,也在此目录中)
  • 机器正在运行 Windows Server 2003,并且在默认目录C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 中安装了 .NET Framework

如果您觉得这可以以更好的方式完成,那么很高兴听到其他建议。我总是可以编写服务安装程序,但这不是优先事项。

【问题讨论】:

    标签: .net installation service batch-file windows-server-2003


    【解决方案1】:

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

    @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
    

    【讨论】:

    • 当我以管理员模式运行批处理文件时,PATH 指的是C:\Windows\system32\service.exe,而不是文件实际存在的路径,为什么?
    • @Anoop 这篇文章已经过时了,因为自 windows vista 以来在安装 windows 服务时以管理员角色运行。我建议在每个文件的顶部放置 (setlocal enableextensions) 和 (cd /d "%~dp0")。
    【解决方案2】:

    只做自安装服务更容易。实现此功能后,您可以使用(/i 或 /u 开关)直接运行服务 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);
        }
    }
    

    【讨论】:

    • 这个建议比维护设置项目或批处理脚本要容易得多。
    • 我正在尝试编写Console.WriteLine('') 声明来安装和卸载,但它没有显示。知道为什么会这样吗?
    【解决方案3】:

    您可以使用命令行参数(-i -u 等)设置您的服务 exe 以支持自我注册/取消注册,而不是编写批处理文件来做同样的事情。

    在 .NET 中创建自安装服务的信息

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

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

    另外,将安装项目添加到您的解决方案并让 Visual Studio 构建安装包可能会更快。

    如何在 Visual Basic .NET 或 Visual Basic 2005 中为 Windows 服务创建安装项目

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

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

    【讨论】:

    • 请注意,Microsoft 在 Visual Studio 2012 中删除了 Setup 项目类型。
    • 除 vb 之外的所有链接都已失效。
    【解决方案4】:

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

    @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
    

    【讨论】:

      【解决方案5】:

      我发现使用一个好的安装项目总是比使用批处理文件安装应用程序更好。虽然有些时候是做不到的。工作中的几个项目是在 Windows NT 和早期的 Windows XP 时代编写的,并使用简单的批处理文件进行安装。在那些时候,将批处理文件转换为安装包比简单的调整更麻烦。经过大量搜索,我发现http://ss64.com/nt/ 是一个非常好的Windows 批处理文件参考。 (感觉很奇怪,随着我们在软件技术方面的所有进步,不得不写最后一句话。)

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

      【讨论】:

        【解决方案6】:

        我不知道为什么你需要一个批处理文件作为一个衬里。这就是我要使用的。

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

        【讨论】:

          【解决方案7】:

          建议:

          • 利用环境,C:上可能没有安装Windows。但您可以使用 %WinDir%。
          • 您可以重定向 echo 以附加到文件:

            回显一条消息>> logfile.txt

          • 在 cmd.exe 中跟踪所有内容并转换所有边缘情况可能具有挑战性,它不是一个丰富的环境。

          • 没有一致的文档位置。但是“cmd”、“if”、“for”、“set”和“call”的帮助(来自命令行)涵盖了大部分可用的语法。
          • 在开始时将 echo 设置为关闭,以便在执行命令时查看命令。

          【讨论】:

            【解决方案8】:

            创建一个扩展名为 .bat 的文件并将其放入文件中

            installutil -u c:\YourServiceLocation\Service.exe

            【讨论】:

              【解决方案9】:

              我用一个老式的批处理文件来做这个......

              将 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
              

              【讨论】:

                【解决方案10】:
                @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
                

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-03-25
                  • 2011-12-10
                  • 2012-09-20
                  • 1970-01-01
                  • 2018-10-30
                  • 1970-01-01
                  • 2014-10-03
                  • 1970-01-01
                  相关资源
                  最近更新 更多