# 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

业务脚本:

@echo off
echo 当前脚本是:%0
echo 输出文件路径是:%1
echo hello,world > %1
pause
1
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

# 案例-批处理加入域

在加入域之前,将当地的本地管理员都禁用掉。

# 非侵入式控制

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

# 侵入式控制

@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

# 案例-批处理退域

非侵入式控制

@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

# 案例-获取电脑的基本信息

将电脑的基本信息打印出来,采用侵入式控制。

@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