# WINDOWS批处理应用3
# 应用场景
在WINDOWS批处理应用1中我们使用U盘作为批处理运行的媒介,实际操作中很有可能会被禁封掉U口,我们可以考虑使用网络共享盘来运行批处理。在CMD中有一些命令在网络存储中不能运行,本文为批处理脚本在网络共享盘中运行提供两种方案。
# 思路
# 控制脚本:
将要运行业务的脚本拷贝到本地运行,得出结果,再将脚本删除,将结果拷贝回网络共享盘。
# 业务脚本:
输出一个hello world到一个结果文件中。
# 方案一:非侵入式控制
将控制拷贝控制脚本和结果的批处理单独做成一个脚本,这样做的优点是控制脚本通用,很好的将控制脚本和业务脚本分离开。请看下面的实例:
控制脚本:
@echo off
set execFolder=C:\
set execFileName=test.bat
set outputFileName=output.txt
::————————————————————
set execFile="%execFolder%%execFileName%"
set output="%execFolder%%outputFileName%"
echo 将执行文件拷贝过去
copy /y "%~dp0%execFileName%" %execFile%
copy /y "%~dp0%outputFileName%" %output%
call %execFile% %output%
del %execFile% /f/q
if exist %output% (
echo 将输出文件拷贝回来
copy /y %output% "%~dp0%outputFileName%"
del %output% /f/q
)
echo 成功执行,返回码:%errorlevel%
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
业务脚本:
@echo off
echo 当前脚本是:%0
echo 输出文件路径是:%1
echo hello,world > %1
pause
1
2
3
4
5
2
3
4
5
# 方案二:侵入式控制
将控制脚本和业务脚本放到一个批处理中,这样做比较好识别。
@echo off
setlocal EnableDelayedExpansion
set execFolder=C:\
set outputFile=output.txt
::——————————————以上可以修改————————————
set execFile="%execFolder%%~nx0"
set output="%~dp0%outputFile%"
set localOutput="%execFolder%%outputFile%"
if "%1"=="exec" (
REM ————————嵌入业务脚本开始————————
echo 当前脚本是:%0
echo 输出文件路径是:%2
echo hello,world > %localOutput%
REM ————————嵌入业务脚本结束————————
) else (
echo 将可执行文件拷贝到目标目录
copy /y %0 %execFile%
call %execFile% exec %output%
echo 成功执行,返回码:!errorlevel!
del %execFile% /f/q
)
if "%1"=="exec" (
if exist %localOutput% (
echo 将输出文件拷贝回当前目录
copy /y %localOutput% %2
del %localOutput% /f/q
)
exit /b 0
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 案例-批处理加入域
在加入域之前,将当地的本地管理员都禁用掉。
# 非侵入式控制
wmic computersystem where Name="%COMPUTERNAME%" call JoinDomainOrWorkgroup Name="school.com" username="school.com\UserName" password="123456" FJoinOptions=3
for /f "skip=4 tokens=1-3" %%i in ('net user') do (
if "%%i" == "命令成功完成。" (
echo "上面是该电脑的全部用户名!"
) else (
if not "%%i"=="" (
echo "禁止用户:%%i"
net user "%%i" /active:no
)
if not "%%j"=="" (
echo "禁止用户:%%j"
net user "%%j" /active:no
)
if not "%%k"=="" (
echo "禁止用户:%%k"
net user "%%k" /active:no
)
)
)
net config workstation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 侵入式控制
@echo off
setlocal EnableDelayedExpansion
set execFolder=C:\
set outputFile=output.txt
::——————————————以上可以修改————————————
set execFile="%execFolder%%~nx0"
set output="%~dp0%outputFile%"
set localOutput="%execFolder%%outputFile%"
if "%1"=="exec" (
REM ————————嵌入业务脚本开始————————
set /p CurrentNum=<%localOutput%
wmic computersystem where Name="%COMPUTERNAME%" call JoinDomainOrWorkgroup Name="school.com" username="school.com\ComputerDepartment!CurrentNum!" password="123456" FJoinOptions=3
for /f "skip=4 tokens=1-3" %%i in ('net user') do (
if "%%i" == "命令成功完成。" (
echo "上面是该电脑的全部用户名!"
) else (
if not "%%i"=="" (
echo "禁止用户:%%i"
net user "%%i" /active:no
)
if not "%%j"=="" (
echo "禁止用户:%%j"
net user "%%j" /active:no
)
if not "%%k"=="" (
echo "禁止用户:%%k"
net user "%%k" /active:no
)
)
)
net config workstation
set /a CurrentNum=!CurrentNum!+1
>%localOutput% echo !CurrentNum!
REM ————————嵌入业务脚本结束————————
) else (
echo 将可执行文件拷贝到目标目录
copy /y %0 %execFile%
echo 将公共配置文件拷贝到目标目录
copy /y %output% %localOutput%
call %execFile% exec %output%
echo 成功执行,返回码:!errorlevel!
del %execFile% /f/q
)
if "%1"=="exec" (
if exist %localOutput% (
echo 将输出文件拷贝回当前目录
copy /y %localOutput% %2
del %localOutput% /f/q
)
exit /b 0
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 案例-批处理退域
非侵入式控制
@echo off
net user administrator asd@123
net user administrator /active:yes
wmic computersystem where Name="%COMPUTERNAME%" call UnJoinDomainOrWorkgroup username="school.com\Username" password="123456"
pause
1
2
3
4
5
6
2
3
4
5
6
# 案例-获取电脑的基本信息
将电脑的基本信息打印出来,采用侵入式控制。
@echo off
setlocal EnableDelayedExpansion
set execFolder=C:\
for /f "tokens=1" %%i in ('hostname') do (
if not "%%i"=="" (
set outputFile=%%i.txt
)
)
::——————————————以上可以修改————————————
set execFile="%execFolder%%~nx0"
set output="%~dp0%outputFile%"
set localOutput="%execFolder%%outputFile%"
if "%1"=="exec" (
REM ————————嵌入业务脚本开始————————
echo 当前脚本是:%0
echo 参数路径是:%2
FOR /F "tokens=2 delims==," %%i in ('wmic nic where "NetConnectionStatus=2 and (netconnectionid like "%%以太网%%" or netconnectionid like "%%本地连接%%")" get netconnectionid /VALUE') DO (set lanAdapter=%%i)
set lanAdapter=!lanAdapter:~0,-1!
echo !lanAdapter!
hostname >> %localOutput%
netsh interface ip show config "!lanAdapter!" >> %localOutput%
netsh interface ip show dnsservers "!lanAdapter!" >> %localOutput%
FOR /F "tokens=2 delims==," %%j in ('wmic nic where "netconnectionid='!lanAdapter!'" get MACAddress /VALUE') DO set macAddress=%%j
echo !macAddress! >> %localOutput%
net config workstation >> %localOutput%
REM ————————嵌入业务脚本结束————————
) else (
echo 将可执行文件拷贝到目标目录
copy /y %0 %execFile%
call %execFile% exec %output%
echo 成功执行,返回码:!errorlevel!
del %execFile% /f/q
)
if "%1"=="exec" (
if exist %localOutput% (
echo 将输出文件拷贝回当前目录
copy /y %localOutput% %2
del %localOutput% /f/q
)
exit /b 0
)
pause
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48