Скрипт Bat для автоматического добавления маршрутов - должен запускаться несколько раз - PullRequest
0 голосов
/ 23 ноября 2011

Я пишу скрипт для автоматического создания / 32 маршрутов к устройствам в сети, доступной через туннельный интерфейс LAB.

Я должен сделать это, потому что туннель LAB должен быть установлен на другой (корпоративный туннель), который автоматически пересылает пакеты внутри него, если нет маршрутов для пункта назначения.Следовательно, я создаю все / 32 маршрута для устройств в сети, чтобы предотвратить пересылку корпоративного туннеля.

Следующий скрипт делает свое дело, но по неизвестной мне причине, я должен выполнить его 3 или 4 раза, прежде чемоно работает.(Обратите внимание, что я большой новичок со скриптом bat)

@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 ]

1 голос
/ 24 ноября 2011

Вот последний скрипт (если кому-то интересно):

@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

Еще раз спасибо за вашу помощь!

С уважением, Сильвен

0 голосов
/ 24 ноября 2011

Если вы попробуете следующий пример, вы увидите, что это не работает:

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

%net% не будет иметь значения или будет иметь старое значение.

См. Расширение переменной в циклах FOR для получения дополнительной информации, почему это происходит.

Вместо использования 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, такая как set "net=10.%labid%", действительно выполняется, и net получает правильное значение. Когда вы запустите его во второй раз, net по-прежнему будет иметь значение из предыдущего запуска, поэтому в этот момент он будет работать так, как ожидается. Каждый раз, когда вы запускаете его, другой set= будет получать правильное значение.

...