2017-03-01 124 views
0

控制服务我想创建一个.bat文件,这将使我的选择不同的服务器之间进行选择和执行诸如停止行动/启动服务。到目前为止,我正在发生系统错误67发生。无法找到网络名称。有一个更好的方法吗。或者我可以从弹出选项中选择服务器名称。创建一个批处理文件,以从多个服务器

@ECHO OFF 
CLS 
ECHO 1.server1 
ECHO 2.server2 
ECHO 3.server3 
ECHO 4.server4 
ECHO. 

set /p server_name=Enter server name: 

IF %server_name%== 1 GOTO app1 
IF %server_name%== 2 GOTO app2 
IF %server_name%== 3 GOTO app3 
IF %server_name%== 4 GOTO app4 

:app1 
call:restart "server1" 
GOTO End 
:app2 
call:restart "server2" 
GOTO End 

:app3 
call:restart "server3" 
GOTO End 

:app4 
call:restart "server4" 
GOTO End 

:restart 
net use \\%~1/User:%username% 
SC \\%~1 Stop service 
timeout 10 
SC \\%~1 Start service 
GOTO End 

回答

0

调试而不是你的文件,我想给你创造一个不同的解决方案:

在要重新启动您的服务创建此bat文件服务器:

@ECHO OFF 
:STOP 
SC STOP <your_service> 
ping 127.0.0.1 -n 6 > nul 
SC QUERY <your_service> | find /I "STATE" | find "STOPPED" 
if errorlevel 1 goto :STOP  
SC START <your_service> 

现在,使用任务计划程序在服务器上创建任务。不要设置任何触发器,但要使任务执行新创建的bat文件。选择您需要的任何选项(如特定用户使用特定密码,是否在没有人登录时运行脚本,是否使用管理员权限运行脚本等)并为其命名(your_task)。

最后,修改你的脚本是这样的:

@ECHO OFF 
CLS 
ECHO 1.server1 
ECHO 2.server2 
ECHO 3.server3 
ECHO 4.server4 
ECHO. 

:SELECT 
set /p server_name=Enter server name: 

IF %server_name%==1 GOTO app1 
IF %server_name%==2 GOTO app2 
IF %server_name%==3 GOTO app3 
IF %server_name%==4 GOTO app4 
GOTO SELECT 
:app1 
SCHTASKS /RUN /S "server1" /TN "your_task" 
GOTO End 
:app2 
SCHTASKS /RUN /S "server2" /TN "your_task" 
GOTO End 
:app3 
SCHTASKS /RUN /S "server3" /TN "your_task" 
GOTO End 
:app4 
SCHTASKS /RUN /S "server4" /TN "your_task" 
GOTO End 
:End 

如果需要,您还可以在用户和密码传递给SCHTASKS命令。

它应该清楚它是如何工作的。我建议仔细看看第一个bat文件。使用此:

SC \\%~1 Stop service 
timeout 10 
SC \\%~1 Start service 

可能会导致麻烦。有时服务不会在10秒内停止,出于各种原因。尝试在尚未停止的情况下启动服务,将导致错误并且服务将保持停止状态。

相反,我们在计划任务内的脚本脚本会尝试停止服务,然后等待5秒(是,-n 6表示5秒^^),然后它会检查服务是否具有“已​​停止”。如果是,它会启动它,否则,它会重新尝试停止它,再等5秒钟,等等。

+0

感谢迈克尔为您详细解释。这非常有帮助,并按预期工作。我还有一个问题。我只是好奇,在我的代码为什么函数没有通过正确的论点。我希望在重新启动功能中传递“服务器名称”,无论它是否显示\%〜1。有什么我想念的。 – user2410266

+0

@ user2410266可能的错误:在'net use \\%〜1/User:%username%'这一行中,** 1 **和**/**之间应该有一个空格。当你跳过'net use'命令时,它也可能工作。 'SC \\%〜1停止服务 - 超时10 - SC \\%〜1启动服务'可能已经完成了这项工作。 – MichaelS

相关问题