局域网内关机批处理程序

2024-12-26 18:05:24
推荐回答(2个)
回答1:

@title 远程关机控制器
@rem powerd by baoping
@echo.
@echo.
@echo.
@echo.
@echo 1 代表关闭所有计算机
@echo.
@echo.
@echo 2 代表关闭指定计算机
@echo.
@echo.
@echo 3 定时关闭所有计算机
@echo.
@echo.
@echo.
@echo.
@set/p var2=请选择要使用的功能[1/2/3]:
@if %var2%==1 goto a
@if %var2%==2 goto b
@if %var2%==3 goto c
exit

::关闭所有计算机
:a
@for %%i in (tsg01 tsg02 tsg03 tsg04 tsg05 tsg06 tsg07 tsg08 tsg09 tsg10) do @shutdown -s -f -m \\%%i -t 10
exit

::关闭指定计算机
:b
@echo.
@echo.
@set/p var= 请输入需要关闭的计算机名:
@shutdown -s -f -m \\%var% -t 10
exit

::定时关闭所有计算机
:c
@sc config schedule start= auto 1>nul 2>nul
@net start schedule 1>nul 2>nul
@echo.
@echo.
@set/p var1= 请输入关机时间: 例[09:30:00]:
@if not exist C:\temp mkdir C:\temp
@if exist C:\temp\task.bat del /Q C:\temp\task.bat
@echo for %%%%a in (tsg01 tsg02 tsg03 tsg04 tsg05 tsg06 tsg07 tsg08 tsg09 tsg10) do @shutdown -s -f -m \\%%%%a -t 10>>C:\temp\task.bat
@schtasks /delete /F /TN "haltpc" 1>nul 2>nul
@schtasks /create /ru system /sc once /tn "haltpc" /st %var1% /tr "C:\temp\task.bat"
exit

回答2:

两条思路
如果是你自己用,并且要求自动化程度比较高,可以用参数实现
如果需要给别人用,要求简单易懂,并且对自动化程度要求不高,可以用set /p命令

先说参数
你调用批处理使用的命令行参数可以直接在批处理中用%0,%1,%2..来调用
比如你的批处理叫test.bat,调用批处理时输入的参数是这样的:
test -a -b -c...
那么在批处理中
%0==test
%1==-a
%2=-b
%3=-c
...
以此类推
你可以自定义一些参数,比如常见的/?显示帮助,/a关闭所有,直接用计算机名做参数关闭指定电脑等等

另外net view命令可以显示局网内所有打开电脑的主机名
配合管道命令"|"和find命令,可以判断指定的电脑是否打开
find命令还支持通配符,你可以让你的批处理命令支持通配符

不方便的地方就是批处理没有select case语句,你必须用if else来判断参数

另一种方法,set /p命令的效果是暂停当前批处理,并从命令行读取一行输入赋给某个变量,比如下面这条命令
set /p test=请输入test的值
的效果是暂停批处理,在屏幕上显示"请输入test的值"并从命令行读取一行输入,将其赋给test

另外,用exit /b n命令可以退出当前批处理而不退出命令行,并且把错误代码"errorlevel"设置为n,这个命令可以用作错误处理

两种方法其实殊途同归,我以命令行参数为例给出一个大概思路

首先判断参数,如果是/?,则打印帮助菜单,推出,错误代码0
如果参数时/all,则net view列出所有计算机,然后分别以其中每一台为参数调用自身
如果不是/?也不是/all,则认为参数是一个计算机名。用net view列出所有计算机名,然后用find命令在其中寻找匹配的项

如果没有找到匹配的项,退出,并返回错误代码1
如果找到多个匹配的项,用其中每一个调用自身
如果只找到一个匹配的项,则运行主程序,试图将其关闭

如果关闭成功,退出,返回错误代码0
如果失败,退出,返回错误代码2

以上,当然掌握了这些命令之后你可以根据自己的设计增加一些功能