用于自动添加路径的Bat脚本 - 必须多次运行

时间:2011-11-23 16:05:52

标签: batch-file routes tunnel ipconfig

我正在编写一个bat脚本,用于自动创建/ 32路由到可通过LAB隧道接口访问的网络中的设备。

我必须这样做,因为必须在另一个(公司隧道)上设置LAB隧道,如果没有目的地路由,它会自动转发其中的数据包。因此,我为网络中的设备创建了所有/ 32路由,以防止转发公司隧道。

以下脚本制作技巧但由于我未知的原因,我必须先运行它3到4次才能运行。 (注意我是蝙蝠脚本的大菜鸟)

@echo off
c:
cd %systemroot%
set /P input=Please enter a LAB ID:
set /A labid=%input%
if %labid% GTR 98 ( 
    if %labid% LSS 255 (
        set "net=10.%labid%"
        for /f "tokens=1-5 delims= " %%A in ('route print ^| findstr %net%') do (
            echo Adding static routes for LAB %labid%...
            set gatewayssl=%%C
            echo Gateway is SSL interface: %gatewayssl%
            for /l %%h in (1,1,254) do call :add_route %%h %gatewayssl%
            goto:EOF
        )
        goto:EOF
    )else (
        echo Invalid Lab ID
        goto:EOF
    )
) else (
    echo Invalid Lab ID
        goto:EOF
)

:add_route
set ipaddr=%net%.0.%1
route add %ipaddr% mask 255.255.255.255 %2% metric 1
goto:EOF

通常,这是产生的输出:

[...]>Z:\ALU\SGCC\LAB\labrouting.bat
Please enter a LAB ID:104
FINDSTR : Ligne de commande erronée

C:\WINNT>Z:\ALU\SGCC\LAB\labrouting.bat
Please enter a LAB ID:104
Adding static routes for LAB 104...
Gateway is SSL interface:

Manipule les tables de routage du réseau.

ROUTE [-f] [-p] [cmde [destin]
[route manual apperas many times because of the for loop...]

C:\WINNT>Z:\ALU\SGCC\LAB\labrouting.bat
Please enter a LAB ID:104
Adding static routes for LAB 104...
Gateway is SSL interface: 192.168.104.1

尽可能地,在运行此脚本3次之后,它最终会起作用。 你能帮忙找出导致这个问题的原因吗?

我提前感谢您的支持。

致以最诚挚的问候,

西尔。

2 个答案:

答案 0 :(得分:1)

这是最终的剧本(如果有人有兴趣):

@echo off

set /P input=Please enter a LAB ID:
set /A labid=%input%
if /i %labid% lss 98 (goto :eof)
if /i %labid% gtr 255 (goto :eof)

call :sub_set_net
echo Your LAB network is: %net%.0.0

call :sub_get_lab_gw
echo Your LAB gateway is: %gatewayssl%

call :sub_add_lab_routes
goto :eof

:sub_error
echo Invalid LAB id (98<labid<255)
goto :eof

:sub_set_net
set "net=10.%labid%"
goto :eof

:sub_get_lab_gw
route print | findstr %net% > %temp%\TMPROUTINGLAB.txt
for /f "tokens=1-5 delims= " %%A in (%temp%\TMPROUTINGLAB.txt) do set gatewayssl=%%C
del %temp%\TMPROUTINGLAB.txt
goto :eof

:sub_add_lab_routes
echo Adding static routes for LAB %labid%...
for /l %%h in (1,1,254) do call :sub_add_route %%h %gatewayssl%
echo Done
pause
goto :eof

:sub_add_route
set ipaddr=%net%.0.%1
route add %ipaddr% mask 255.255.255.255 %2% metric 1
goto :eof

:eof

再次感谢您的帮助!

祝你好运, 西尔

答案 1 :(得分:0)

如果您尝试以下示例,您将看到这不起作用:

@echo off
set labid=104
if %labid% GTR 98 ( 
    if %labid% LSS 255 (
        set "net=10.%labid%"
        echo net=%net%
    )
)
pause

%net%没有值,或者它将具有旧值。

有关发生这种情况的详细信息,请参阅Variable Expansion in FOR Loops

您也可以调用子路由来解决此问题,而不是使用setlocal enableextensions

set labid=104
if %labid% GTR 98 ( 
    if %labid% LSS 255 (
        call :setnet
    )
)

pause
goto :eof

:setnet

set "net=10.%labid%"
echo net=%net%
goto :eof

:eof

如果多次运行它的原因是,set "net=10.%labid%"之类的set命令会被执行,net会获得正确的值。当你第二次运行它时,net仍然具有上一次运行的值,因此它将在那一刻按预期工作。每次运行它时,另一个set=将获得正确的值。