繁体   English   中英

用于安装或卸载 .NET Windows 服务的批处理脚本

[英]Batch Script to Install or Uninstall a .NET Windows Service

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

以下是一些细节:

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

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

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

@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

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

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

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

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

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

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

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

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

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

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

@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

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

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

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

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

@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 文件

建议:

  • 利用环境,C:上可能安装不了Windows。 但是你可以使用 %WinDir%。
  • 您可以将回显重定向到 append 到文件:

    回显消息>> logfile.txt

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

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

我用一个老式的批处理文件做到了这一点......

将 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 命令行选项的更多信息,请参见此处

要卸载该服务,请使用具有以下内容的不同批处理文件:


installutil MyService.exe /u

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

installutil -u c:\YourServiceLocation\Service.exe

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM