Command line 如何停止windows服务,检查其是否已停止,并使用Cmd行重新启动?

Command line 如何停止windows服务,检查其是否已停止,并使用Cmd行重新启动?,command-line,cmd,command-prompt,Command Line,Cmd,Command Prompt,我有一个相当简单的任务要完成,但我完全不懂命令行脚本。我在谷歌上搜索了一下,找到了一些与windows机器上的服务交互的基本命令,但在检查服务是启动还是停止方面什么都没有。我希望有人能帮我编写一个脚本,停止3个服务,检查确保所有3个服务都停止,一旦所有服务都停止,重新启动它们。在启动任何一个备份之前,我需要确保所有3个都已停止。我知道如何停止和启动服务,但其余的都是我被卡住的地方 net Stop S1 net Stop S2 net Stop S3 //Check if all 3 are

我有一个相当简单的任务要完成,但我完全不懂命令行脚本。我在谷歌上搜索了一下,找到了一些与windows机器上的服务交互的基本命令,但在检查服务是启动还是停止方面什么都没有。我希望有人能帮我编写一个脚本,停止3个服务,检查确保所有3个服务都停止,一旦所有服务都停止,重新启动它们。在启动任何一个备份之前,我需要确保所有3个都已停止。我知道如何停止和启动服务,但其余的都是我被卡住的地方

net Stop S1
net Stop S2
net Stop S3

//Check if all 3 are stopped

//If all 3 have been stopped successfully
net start s1
net start s2
net start s3
我已经想出了这个,但不认为语法是正确的

net stop PriceIdxImport
net stop RawDataImportDB
net stop DBDailyTrxProcessService

set Pstate = sc query PriceIdxImport state
set Rstate = sc query RawDataImportDB state
set Dstate = sc query DBDailyTrxProcessService state

if Pstate == Inactive if Rstate == Inactive if Dstate == Inactive GOTO sub_StartServices

:sub_StartServices
net start PriceIdxImport
net start RawDataImportDB
net start DBDailyTrxProcessService

好吧,我把上面的脚本改成了一个while循环。它不能正确地执行循环吗?它检查了状态,然后退出:(


请试试这个脚本

echo on
:sub_StopServices    
net stop PriceIdxImport
net stop RawDataImportDB
net stop DBDailyTrxProcessService

set Pstate = Sc query PriceIdxImport  |find /i "STOPPED"
set Rstate = sc query RawDataImportDB |find /i "STOPPED"
set Dstate = sc query DBDailyTrxProcessService |find /i "STOPPED"

if Pstate neq "" ( if Rstate  neq "" (if  Dstate neq "" (GOTO sub_StartServices) else (GOTO sub_StopServices) ) else (GOTO sub_StopServices)) else (GOTO sub_StopServices)
exit
:sub_StartServices
net start PriceIdxImport
net start RawDataImportDB
net start DBDailyTrxProcessService

我建议使用t
net start | stop
over
sc start | stop
,因为后者是非阻塞的。这使得使用它更有理由。另外,sc是专门为处理服务而编写的……尽管最终它归结为一种编码风格:)是否需要非阻塞操作取决于实际要求/情况。在OP的情况下,我当然更喜欢阻塞操作,因为它将省去我在循环中检查服务状态(以及超时)的麻烦。有没有办法将其放入while循环?我之所以这么问是因为这个脚本需要运行,直到所有3个都停止,然后才重新启动所有3个。我需要一个循环,当2下降但1保持上升时…它需要停止所有3again并再次检查所有3,以确保在退出循环并启动它们之前,所有3都下降。net start/stop是阻塞的。因此,直到服务下降或从以前开始下降,它不会移动到下一行scriptVariable赋值,必须按如下方式执行:
set var=foo bar
(在
=
周围没有空格)。好的,我将3个set语句更改为没有空格,因此它适合var=xxx格式
echo on
:sub_StopServices    
net stop PriceIdxImport
net stop RawDataImportDB
net stop DBDailyTrxProcessService

set Pstate = Sc query PriceIdxImport  |find /i "STOPPED"
set Rstate = sc query RawDataImportDB |find /i "STOPPED"
set Dstate = sc query DBDailyTrxProcessService |find /i "STOPPED"

if Pstate neq "" ( if Rstate  neq "" (if  Dstate neq "" (GOTO sub_StartServices) else (GOTO sub_StopServices) ) else (GOTO sub_StopServices)) else (GOTO sub_StopServices)
exit
:sub_StartServices
net start PriceIdxImport
net start RawDataImportDB
net start DBDailyTrxProcessService