做了好多年的Linux的系统管理,写了很多次的bash脚本处理一些指定的事件。今天接到了一个小任务,在windows下做一个根据配置文件来配置网络的小程序。做这种配置工作在linux中最简单的方式就是用bash,惯性思维,我想到了批处理。由于以前基本没有认真的使用过批处理来执行某一个特定任务,因而在此次过程当中。我发现真的很麻烦,最主要原因有两个,可以辅助的工具太少了,还有就是脚本语言的能力太弱了。 辅助工具少,我的感受就是字处理和文本能力比较差,我想解析一个文件找不到很好的工具来辅助。不想linux至少我可以用grep,好一点我还可以用cut、awk等等。语言能力差,我觉得就是他连最基本的作用域的概念都不支持,所有的if和for之类的逻辑处理关键字后面的逻辑处理都只支持一个命令的执行。太让我失望了,这次的初探也许是我最后的使用,我觉得如果希望解决一个复杂点的任务,在windows下还不如使用c语言编程的方法实现呢。
好了,言归正传,说说我的任务和脚本吧。我的任务就是根据一个配置文件来完成网络配置,配置文件中的mac地址是关键值,它所对应的ip地址必须配置到系统中具有这个mac地址的相应网络接口上
脚本如下:
1 192.168.0.252 00-16-D3-93-04-AB
1.1 192.168.22.252 00-16-D3-93-04-AB
1.1代表的是在第一块网卡上增加绑定的第二个IP地址。以此类推如果使用的是不带点的ID标识(如1),就是此网卡只有一个IP地址,否则(如1.1)就是有不止一个IP地址。
::获取所有的网络接口名称以及对应的mac地址到一个文件中
ipconfig /all >>c:/ip.tmp
find "Ethernet adapter" c:/ip.tmp >c:/a.tmp
find "Physical Address" c:/ip.tmp >c:/b.tmp
for /F "skip=2 tokens=1 delims=:" %%M in (c:/a.tmp) do (
set ip=%%M
goto a1
)
:a1
for /F "tokens=3" %%M in ("%ip%") do set ip1_1=%%M
for /F "skip=3 tokens=1 delims=:" %%M in (c:/a.tmp) do (
set ip=%%M
goto a2
)
:a2
for /F "tokens=3" %%M in ("%ip%") do set ip1_2=%%M
for /F "skip=4 tokens=1 delims=:" %%M in (c:/a.tmp) do (
set ip=%%M
goto a3
)
:a3
for /F "tokens=3" %%M in ("%ip%") do set ip1_3=%%M
for /F "skip=2 tokens=2 delims=:" %%M in (c:/b.tmp) do (
set ip=%%M
goto a1
)
:a1
set ip2_1=%ip%
for /F "skip=3 tokens=2 delims=:" %%M in (c:/b.tmp) do (
set ip=%%M
goto a2
)
:a2
set ip2_2=%ip%
for /F "skip=4 tokens=2 delims=:" %%M in (c:/b.tmp) do (
set ip=%%M
goto a3
)
:a3
set ip2_3=%ip%
echo %ip1_1% %ip2_1% >> c:/temp.out
echo %ip1_2% %ip2_2% >> c:/temp.out
echo %ip1_3% %ip2_3% >> c:/temp.out
:::此处生成的c:/temp.out文件最多包括三个网络接口
此文件如下
本地连接 00-16-D3-93-04-AB
无线网络连接 00-19-D2-7F-8E-34
无线网络连接 00-19-D2-7F-8E-34
::根据上述生成的中间文件,以及最上面提到的配置文件来进行配置网络接口的ip地址网关等信息。
for /F "skip=1 tokens=1,2,3 delims= " %%M in (c:/windows.cfg) do (
set id=%%M
set ip=%%N
set mac=%%O
goto b11
)
:b11
(
find "%mac%" c:/temp.out >c:/m.tmp
goto b12
)
:b12
for /F "skip=2 tokens=1 delims= " %%M in (c:/m.tmp) do (
if %id%==1.1 (
echo netsh interface ip add address "%%M" addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=2 >nul
)
if not %id%==1.1 (
echo netsh interface ip set address "%%M" source=static addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=0 >nul
)
del c:/m.tmp
)
for /F "skip=2 tokens=1,2,3 delims= " %%M in (c:/windows.cfg) do (
set id=%%M
set ip=%%N
set mac=%%O
goto b21
)
:b21
(
find "%mac%" c:/temp.out >c:/m.tmp
goto b22
)
:b22
for /F "skip=2 tokens=1 delims= " %%M in (c:/m.tmp) do (
if %id%==1.1 (
echo netsh interface ip add address "%%M" addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=2 >nul
)
if not %id%==1.1 (
echo netsh interface ip set address "%%M" source=static addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=0 >nul
)
del c:/m.tmp
)
for /F "skip=3 tokens=1,2,3 delims= " %%M in (c:/windows.cfg) do (
set id=%%M
set ip=%%N
set mac=%%O
goto b31
)
:b31
(
find "%mac%" c:/temp.out >c:/m.tmp
goto b32
)
:b32
for /F "skip=2 tokens=1 delims= " %%M in (c:/m.tmp) do (
if %id%==1.1 (
echo netsh interface ip add address "%%M" addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=2 >nul
)
if not %id%==1.1 (
echo netsh interface ip set address "%%M" source=static addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=0 >nul
)
del c:/m.tmp
)
for /F "skip=4 tokens=1,2,3 delims= " %%M in (c:/windows.cfg) do (
set id=%%M
set ip=%%N
set mac=%%O
goto b41
)
:b41
(
find "%mac%" c:/temp.out >c:/m.tmp
goto b42
)
:b42
for /F "skip=2 tokens=1 delims= " %%M in (c:/m.tmp) do (
if %id%==1.1 (
echo netsh interface ip add address "%%M" addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=2 >nul
)
if not %id%==1.1 (
echo netsh interface ip set address "%%M" source=static addr=%ip% mask=%netmask% gateway=%gateway% gwmetric=0 >nul
)
del c:/m.tmp
)