【问题标题】:How to restart service using command prompt?如何使用命令提示符重新启动服务?
【发布时间】:2011-12-11 12:05:55
【问题描述】:

我想使用 Inno Setup 的 [Icons] 部分中的命令提示符重新启动 Windows 服务。请帮我解决问题。

【问题讨论】:

  • 你上次问的时候我不是在cmets给an answer to this了吗?使用小型包装器 EXE 提供清单以提供所需的权限并启动/重新启动服务。
  • 这个问题是题外话,因为它询问“如何在命令提示符下重新启动服务”,并且不是特定于 innosetup。

标签: windows-services installation inno-setup


【解决方案1】:

PowerShell 具有一个Restart-Service cmdlet,可以根据需要启动或重新启动服务。

Restart-Service cmdlet 向指定服务的 Windows 服务控制器发送一条停止消息,然后发送一条启动消息。如果服务已经停止,它会在不通知您错误的情况下启动。

您可以通过服务名称或显示名称指定服务,也可以使用InputObject 参数传递一个对象,该对象代表您要重新启动的每个服务。

这比运行两个单独的命令要简单一些。

最简单的使用方法是直接传递服务名称或显示名称:

Restart-Service 'Service Name'

它可以直接在标准 cmd 提示符下使用如下命令:

powershell -command "Restart-Service 'Service Name'"

【讨论】:

    【解决方案2】:

    这是我的代码,用于使用SC 命令启动/停止 Windows 服务。如果服务无法启动/停止,它将打印日志信息。您可以通过 Inno Setup 进行尝试。

    { start a service }
    Exec(ExpandConstant('{cmd}'), '/C sc start ServiceName', '',
         SW_HIDE, ewWaitUntilTerminated, ResultCode);
    Log('sc start ServiceName:'+SysErrorMessage(ResultCode));
    
    { stop a service }
    Exec(ExpandConstant('{cmd}'), '/C sc stop ServiceName', '',
         SW_HIDE, ewWaitUntilTerminated, ResultCode);
    Log('sc stop ServiceName:'+SysErrorMessage(ResultCode));
    

    【讨论】:

      【解决方案3】:

      您可以使用sc start [service] 启动服务并使用sc stop [service] 停止它。对于某些服务,net start [service] 也在做同样的事情。

      但是如果你想在同一批次中使用它,请注意sc stop 不会等待服务停止。在这种情况下,您必须使用net stop [service],后跟net start [service]。这将同步执行。

      【讨论】:

      • 使用 sc start + sc stop 对我不起作用(开始部分不起作用)。但是使用 net stop + net start 确实有效!
      • 您是否尝试过在服务名称中使用引号?
      • sc 的问题是它不等待启动/停止完成,它只向服务发送启动/停止请求 - 所以你不能st stop Foo && sc start Foo,因为它失败了- 它在完成停止之前尝试启动服务。 net 在这里使用正确,因为它等待启动/停止完成。
      • 在运行启动命令之前,我们如何确保服务已经成功停止?当我们再次运行启动命令时,停止过程可能正在进行中。
      • 如果我不想以管理员身份运行它,但知道管理员权限怎么办?有没有办法使用用户名和密码运行命令来重新启动它?
      【解决方案4】:

      重新启动正在运行的服务:

      net stop "service name" && net start "service name"
      

      但是,如果您不知道服务是否一开始就在运行,并且想要重新启动或启动它,请使用:

      net stop "service name" & net start "service name"
      

      无论服务是否已经运行,这都有效。

      作为参考,这里是条件处理符号上的documentation

      【讨论】:

      • 带有|| 的第二个版本非常不正确-如果服务正在运行,它将停止,命令成功并且根本不执行第二个命令。试试echo a || echo b
      【解决方案5】:

      您可以使用SC 命令启动、停止和查询服务。至于 innosetup 我不确定。

      【讨论】:

        【解决方案6】:
        net.exe stop "servicename" && net.exe start "servicename"
        

        【讨论】:

        • 有没有单一的cmd重启服务?
        • 您可以编写一个包含 net.exe stop %1 && net.exe start %1 的脚本
        • 有用的命令,但也不必每次都写.exe
        【解决方案7】:

        您可以创建一个包含以下内容的 .bat 文件:

        net stop "my service name"
        net start "my service name"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 2013-07-12
          • 2014-10-28
          • 2015-11-26
          • 2018-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多