首页 文章

通过批处理或cmd文件停止并启动服务?

提问于
浏览
261

我如何编写一个bat或cmd脚本来通过错误检查可靠地停止和启动服务(或者让我知道它因任何原因都没有成功)?

15 回答

  • 3

    使用 SC (服务控制)命令,它提供了比 startstop 更多的选项 .

    DESCRIPTION:
              SC is a command line program used for communicating with the
              NT Service Controller and services.
      USAGE:
          sc <server> [command] [service name]  ...
    
          The option <server> has the form "\\ServerName"
          Further help on commands can be obtained by typing: "sc [command]"
          Commands:
            query-----------Queries the status for a service, or
                            enumerates the status for types of services.
            queryex---------Queries the extended status for a service, or
                            enumerates the status for types of services.
            start-----------Starts a service.
            pause-----------Sends a PAUSE control request to a service.
            interrogate-----Sends an INTERROGATE control request to a service.
            continue--------Sends a CONTINUE control request to a service.
            stop------------Sends a STOP request to a service.
            config----------Changes the configuration of a service (persistant).
            description-----Changes the description of a service.
            failure---------Changes the actions taken by a service upon failure.
            qc--------------Queries the configuration information for a service.
            qdescription----Queries the description for a service.
            qfailure--------Queries the actions taken by a service upon failure.
            delete----------Deletes a service (from the registry).
            create----------Creates a service. (adds it to the registry).
            control---------Sends a control to a service.
            sdshow----------Displays a service's security descriptor.
            sdset-----------Sets a service's security descriptor.
            GetDisplayName--Gets the DisplayName for a service.
            GetKeyName------Gets the ServiceKeyName for a service.
            EnumDepend------Enumerates Service Dependencies.
    
          The following commands don't require a service name:
          sc <server> <command> <option>
            boot------------(ok | bad) Indicates whether the last boot should
                            be saved as the last-known-good boot configuration
            Lock------------Locks the Service Database
            QueryLock-------Queries the LockStatus for the SCManager Database
      EXAMPLE:
              sc start MyService
    
  • 26

    以下是使用批处理启动系统还原的Windows 10命令:

    sc config swprv start= Auto
    

    您可能也喜欢这些命令:

    • 将注册表值更改为自动启动系统还原

    REG ADD“HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore”/ v DisableSR / t REG_DWORD / d 0 / f

    • 创建系统还原点

    Wmic.exe /命名空间:\ root \ default路径SystemRestore调用CreateRestorePoint“djibe保存您的PC”,100,12

    • 更改系统还原磁盘使用情况

    vssadmin resize shadowstorage / for = C:/ on = C:/ maxsize = 10%

    请享用

  • 8
    net start [serviceName]
    

    net stop [serviceName]
    

    告诉你他们是否已经成功或失败了 . 例如

    U:\>net stop alerter
    The Alerter service is not started.
    
    More help is available by typing NET HELPMSG 3521.
    

    如果从批处理文件运行,则可以访问返回代码的ERRORLEVEL . 0表示成功 . 任何更高的值表示失败 .

    作为bat文件, error.bat

    @echo off
    net stop alerter
    if ERRORLEVEL 1 goto error
    exit
    :error
    echo There was a problem
    pause
    

    输出如下:

    U:\>error.bat
    The Alerter service is not started.
    
    More help is available by typing NET HELPMSG 3521.
    
    There was a problem
    Press any key to continue . . .
    

    Return Codes

    - 0 = Success
     - 1 = Not Supported
     - 2 = Access Denied
     - 3 = Dependent Services Running
     - 4 = Invalid Service Control
     - 5 = Service Cannot Accept Control
     - 6 = Service Not Active
     - 7 = Service Request Timeout
     - 8 = Unknown Failure
     - 9 = Path Not Found
     - 10 = Service Already Running
     - 11 = Service Database Locked
     - 12 = Service Dependency Deleted
     - 13 = Service Dependency Failure
     - 14 = Service Disabled
     - 15 = Service Logon Failure
     - 16 = Service Marked For Deletion
     - 17 = Service No Thread
     - 18 = Status Circular Dependency
     - 19 = Status Duplicate Name
     - 20 = Status Invalid Name
     - 21 = Status Invalid Parameter 
     - 22 = Status Invalid Service Account
     - 23 = Status Service Exists
     - 24 = Service Already Paused
    

    Edit 20.04.2015

    退货代码:

    NET命令不返回记录的Win32_Service类返回码(服务未激活,服务请求超时等),并且对于许多错误,将只返回Errorlevel 2 .

    看这里:http://ss64.com/nt/net_service.html

  • 1

    您可以使用NET START命令,然后检查ERRORLEVEL环境变量,例如

    net start [your service]
    if %errorlevel% == 2 echo Could not start service.
    if %errorlevel% == 0 echo Service started successfully.
    echo Errorlevel: %errorlevel%
    

    免责声明:我从头脑中写下了这个,但我认为它会起作用 .

  • 4

    这不是检查代码,而是也可以

    net start "Apache tomcat" || goto ExitError
    
    :End  
    exit 0  
    
    :ExitError  
    echo An error has occurred while starting the tomcat services  
    exit 1
    
  • 190

    我为此创建了我的个人批处理文件,我的有点不同,但可以根据需要随意修改 . 我不久前创建了这个,因为我很无聊,想让人们能够输入结束,开始,停止或设置为自动的简单方法 . 此BAT文件只是要求您输入服务名称,它将为您完成剩下的工作 . 我没有意识到他正在寻找任何表明任何错误的东西,我一定误读了那一部分 . 虽然通常可以通过在行尾输入>> output.txt来完成 .

    %var%只是用户能够在其中输入自己的服务的一种方式,而不是每次要启动/停止其他服务时都必须修改bat文件 .

    如果我错了,任何人都可以随意纠正我 .

    @echo off
    set /p c= Would you like to start a service [Y/N]?
      if /I "%c%" EQU "Y" goto :1
      if /I "%c%" EQU "N" goto :2
        :1  
        set /p var= Service name: 
    :2 
    set /p c= Would you like to stop a service [Y/N]?
      if /I "%c%" EQU "Y" goto :3
      if /I "%c%" EQU "N" goto :4
        :3  
        set /p var1= Service name:
    :4
    set /p c= Would you like to disable a service [Y/N]?
      if /I "%c%" EQU "Y" goto :5
      if /I "%c%" EQU "N" goto :6
        :5  
        set /p var2= Service name:
    :6 
    set /p c= Would you like to set a service to auto [Y/N]?
      if /I "%c%" EQU "Y" goto :7
      if /I "%c%" EQU "N" goto :10
        :7  
        set /p var3= Service name:
    :10
    sc start %var%
    sc stop %var1%
    sc config %var2% start=disabled
    sc config %var3% start=auto
    
  • 322

    使用 net startnet stop 的返回代码对我来说似乎是最好的方法 . 试试这个:Net Start return codes .

  • 7

    语法总是让我....所以......

    如果您是两台计算机上的管理员,以管理员身份运行.bat,并且这些计算机位于同一域中,则明确说明如何向批处理文件添加一行以终止远程服务(在另一台计算机上) . 机器名称遵循UNC格式\ myserver

    sc \\ip.ip.ip.ip stop p4_1
    

    在这种情况下...当您在Service Manager中查看服务的属性时,p4_1既是服务名称又是显示名称 . 您必须使用服务名称 .

    对于您的服务行动爱好者...请务必附上您的原因代码和评论!即'4'等于'计划'并评论'停止服务器维护'

    sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
    
  • 6

    我们认为“净停止”将停止服务 . 可悲的是,现实并非那种黑与白 . 如果服务需要很长时间才能停止,则命令将在服务停止之前返回 . 但是,除非你检查errorlevel,否则你不会知道 .

    解决方案似乎是循环查找服务的状态,直到它停止,每次循环都有一个暂停 .

    但话又说回来...

    我看到第一个服务需要很长时间才能停止,然后后续服务的“网络停止”似乎什么都不做 . 查看服务管理器中的服务,其状态仍为“已启动” - 不会更改为“正在停止” . 然而,我可以使用SCM手动停止第二次服务,并在3或4秒内停止 .

  • 1

    或者您可以使用此cmd启动远程服务: sc \\<computer> start <service>

  • 2

    我刚才使用了Jonas的例子并创建了0到24个错误级别的完整列表 . 其他帖子是正确的 net startnet stop 仅使用 errorlevel 0表示成功,2表示失败 .

    但这对我有用:

    net stop postgresql-9.1
    if %errorlevel% == 2 echo Access Denied - Could not stop service
    if %errorlevel% == 0 echo Service stopped successfully
    echo Errorlevel: %errorlevel%
    

    stop 更改为 start 并反向运行 .

  • 2

    手动服务重启是可以的 - services.msc有“Restart”按钮,但在命令行中,sc和net命令都缺少“restart”开关,如果在cmd / bat文件中安排了重启,则服务会立即停止并启动,有时它会得到一个错误,因为服务还没有停止,它需要一些时间来关闭 .

    这可能会产生错误:sc stop sc sc start

    插入超时是一个好主意,我使用ping(每1秒ping一次):sc stop ping localhost -n 60 sc start

  • 0

    SC 可以用服务做任何事情......启动,停止,检查,配置等......

  • 1

    有时你会发现停止不起作用..

    我的SQlServer有时会这样做 . 使用以下命令行可以杀死它 . 如果你真的需要你的脚本杀死不停止的东西 . 作为最后的手段,我会这样做

    taskkill /pid [pid number] /f
    
  • 5

    我在C#中编写一个Windows服务,停止/卸载/构建/安装/启动循环太累了 . 写了一个迷你脚本,称之为 reploy.bat 并放入我的Visual Studio输出目录(具有内置服务可执行文件的目录)中以自动化循环 .

    只需设置这3个变量

    servicename :这显示在Windows服务控制面板(services.msc)上

    slndir :包含解决方案(.sln)文件的文件夹(不是完整路径)

    binpath :构建中服务可执行文件的完整路径(不是文件夹路径)

    注意:这需要从Visual Studio开发人员命令行运行 msbuild 命令才能工作 .

    SET servicename="My Amazing Service"
    SET slndir="C:dir\that\contains\sln\file"
    SET binpath="C:path\to\service.exe"
    SET currdir=%cd%
    
    call net stop %servicename%
    call sc delete %servicename%
    cd %slndir%
    call msbuild 
    cd %bindir%
    call sc create %servicename% binpath=%binpath%
    call net start %servicename%
    cd %currdir%
    

    也许这有助于某人:)

相关问题