File 使用bat文件启动或停止windows服务

File 使用bat文件启动或停止windows服务,file,batch-file,File,Batch File,我需要使用.bat文件启动或停止大约5个windows服务。我一直在做下面的工作。但是一旦我运行了这个,我会得到一个错误-%x找不到服务 for %%x in ( "service 1" "service 2" "service 3" ) do net start | find %%x > nul 2>&1 if not .%errorlevel%.==.0. net start %%x >nul goto skip :skip pause 在代码中,for循环

我需要使用.bat文件启动或停止大约5个windows服务。我一直在做下面的工作。但是一旦我运行了这个,我会得到一个错误-%x找不到服务

for %%x in (
"service 1"
"service 2"
"service 3"
) do net start | find %%x > nul 2>&1 
if not .%errorlevel%.==.0. net start %%x >nul
goto skip

:skip
pause 
在代码中,for循环中只执行第一次净启动。您需要将这些命令形成一个代码块括号内的行序列

缺点是,当解析代码块时,任何%var%都将被当时的值%var%替换

因此,您需要使用errorlevel的原始语法if errorlevel n,这意味着如果errorlevel为n或大于n


由于您似乎希望重试,那么在网络启动后errorlevel=1或更多的情况下要执行的指令是重试,我假设您希望在重试失败时转到skip。请注意,如果最初的尝试成功,errorlevel将为0,因此我假设if将失败,并且不会执行重试,因此errorlevel将保持为0。

有人可以在这里帮助我吗?您也可以使用SC QUERY命令检查服务的状态。非常感谢您的回答。在您的代码中,errorlevel 1表示服务已启动,因此要求它跳过?@Magoo第二次网络启动不是重试。这是它第一次实际启动服务,前一次净启动只是一个检查服务是否已经运行的查询。@Mounika第二次if errorlevel 1表示启动服务时出错,因此它退出循环。我不知道当它失败时,净启动为errorlevel分配了什么值。通常,成功时分配0,失败时分配非零,因此如果errorlevel 1 dothis指令将执行dothis指令如果errorlevel不是0 1或更高,因此如果net start失败,则假定net start将在成功时将errorlevel设置为0,在失败时将非0。因此,第一个将尝试重试,第二个将退出以跳过重试fails@KlitosKyriacou:我错过了第一个净开始是一个查询
for %%x in (
"service 1"
"service 2"
"service 3"
) do (
 net start | find %%x > nul 2>&1 
 if errorlevel 1 net start %%x >nul
 if errorlevel 1 goto skip
)

:skip