0

LAB トンネル インターフェイス経由で到達可能なネットワーク内のデバイスへの /32 ルートを自動的に作成するためのバット スクリプトを作成しています。

これを行う必要があるのは、宛先へのルートがない場合に 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 回実行した後、最終的に機能します。この問題の原因を特定するのを手伝っていただけませんか?

平素より格別のお引き立てを賜り、厚く御礼申し上げます。

よろしくお願いします、

シルヴァン。

4

2 に答える 2

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

助けてくれてありがとう!

よろしく、 シルヴァン

于 2011-11-24T11:08:27.067 に答える
0

次の例を試してみると、これが機能しないことがわかります。

@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 "net=10.%labid%"doのようなsetコマンドが実行され、netが正しい値を取得するためです。2回目に実行しても、netには前回の実行の値が残っているため、その時点で期待どおりに機能します。実行するたびに、別set=の値が正しい値を取得します。

于 2011-11-23T21:17:48.357 に答える