V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
word2064128279
V2EX  ›  Bash

有个脚本代码的问题

  •  
  •   word2064128279 · 315 天前 · 805 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原因:想写一个批量加静态路由的 bat 脚本,适用于不同网段的终端快速配置双网卡上网。

    过程:由于是第一次写,也不知道怎么在网上找只能用 gpt3.5 艰难的生成好了所有功能,但是太长了,问了同事 可以用变量缩短,又是一个上午过去了 gpt 被玩坏了发一句抱歉一句然后瞎扯。

    route add -p "A" mask 255.255.255.0 "B" 结果:目前是删除路由的那段脚本好了,添加脚本提示一堆看着像不合规的命令输出,这段要实现的是在"A"变量 组里面循环一次,"B"里的下一跳路由用户输入的序号提供,由于用户直接输入的是网段还需要再改写成网关 才行,下面是代码,希望有大佬给指点下,万分感谢:

    @echo off
    PUSHD %~DP0
    TITLE 双网卡配置脚本
    mode con cols=60 lines=32
    color 3e
    
    :menu
    cls
    echo.
    echo. 请选择内网网段
    echo ---------------------------
    echo.
    echo        0  10.10.6.0
    echo        1  10.10.7.0
    echo        2  10.10.8.0
    echo        3  10.10.9.0
    echo        4  10.10.10.0
    echo        5  10.10.11.0
    echo        6  10.10.12.0
    echo        7  10.10.13.0
    echo        8  10.10.14.0
    echo        9  192.168.200.0
    echo        10 192.168.22.0
    echo        11 192.168.201.0
    echo.
    echo.
    echo        q  退出
    echo.
    echo        d  删除路由表
    echo.
    echo ---------------------------
    echo.
    
    echo. 请输入序号:
    set /p ID=
    
    if "%ID%"=="q" (
        goto :eof
    )
    
    if "%ID%"=="d" (
        goto delete_routes
    )
    
    if %ID% LSS 0 (
        goto menu
    )
    
    setlocal enabledelayedexpansion
    
    set "routes=10.10.6.0 10.10.7.0 10.10.8.0 10.10.9.0 10.10.10.0 10.10.11.0 10.10.12.0 10.10.13.0 10.10.14.0 192.168.200.0 192.168.22.0 192.168.201.0"
    set "gateways=10.10.6.1 10.10.7.1 10.10.8.1 10.10.9.1 10.10.10.1 10.10.11.1 10.10.12.1 10.10.13.1 10.10.14.1 192.168.200.1 192.168.22.1 192.168.201.1"
    
    for /L %%i in (0,1,11) do (
        if "!ID!"=="%%i" (
            set "gw=!gateways%%i!"
            for %%a in (!routes!) do (
                route add -p %%a mask 255.255.255.0 !gw!
                echo 已添加路由: %%a !gw!
            )
        )
    )
    
    
    echo. 添加完成
    
    timeout /t 50 >nul
    goto menu
    
    :delete_routes
    set "routes=10.10.6.0 10.10.7.0 10.10.8.0 10.10.9.0 10.10.10.0 10.10.11.0 10.10.12.0 10.10.13.0 10.10.14.0 192.168.200.0 192.168.22.0 192.168.201.0"
    
    for %%r in (%routes%) do (
        route delete %%r
        echo 已删除路由: %%r
    )
    
    timeout /t 1 >nul
    echo. 删除完成
    goto :menu
    
    7 条回复    2023-12-27 17:10:00 +08:00
    word2064128279
        1
    word2064128279  
    OP
       315 天前
    不加变量等有 400 行,想学习下缩短,或者大佬们如果有更好 1 方法或者要如何改写哪里有问题劳烦指点一二
    fuzzsh
        2
    fuzzsh  
       315 天前
    双网卡
    又这么多的 gateway?

    :nic1
    set list=10.10.6.0 10.10.7.0 10.10.8.0 10.10.9.0 10.10.10.0 10.10.11.0 10.10.12.0 10.10.13.0 10.10.14.0
    (for %%a in (%list%) do (
    route add %%a mask 255.255.255.0 1.2.3.4
    ))

    :nic2
    set list=192.168.200.0 192.168.22.0 192.168.201.0
    (for %%a in (%list%) do (
    route add %%a mask 255.255.255.0 5.6.7.8
    ))
    Puteulanus
        3
    Puteulanus  
       315 天前
    要不试试让它用 powershell 写,应该比 bat 好使一些
    word2064128279
        4
    word2064128279  
    OP
       315 天前 via Android
    @fuzzsh 有的老哥,只用批量添加路由上去就行了,这两段代码好像不是。是要对用户输入的网段该写成网关再进行路由的添加
    word2064128279
        5
    word2064128279  
    OP
       315 天前 via Android
    @Puteulanus 好的,我试试
    xxbdh
        6
    xxbdh  
       314 天前
    根据你的描述,按照自己的理解,简单做了修改和简化。

    @echo off & setlocal enabledelayedexpansion
    PUSHD %~DP0
    TITLE 双网卡配置脚本
    mode con cols=60 lines=32
    color 3e

    set "routes=10.10.6.0 10.10.7.0 10.10.8.0 10.10.9.0 10.10.10.0 10.10.11.0 10.10.12.0 10.10.13.0 10.10.14.0 192.168.200.0 192.168.22.0 192.168.201.0"

    :menu
    cls
    echo.
    echo. 请选择所处内网网段
    echo ---------------------------
    echo.
    set _id=
    for %%s in (%routes%) do (
    set /a _id+=1
    echo !_id! %%s
    set _route=%%s
    set gateway#!_id!=!_route:~0,-2!.1
    )
    echo.
    echo.
    echo q 退出
    echo.
    echo d 删除路由表
    echo.
    echo ---------------------------
    echo.
    set /p ID= 请输入序号:

    if /i "%ID%"=="q" goto :eof
    if /i "%ID%"=="d" goto delete_routes
    if not defined gateway#%ID% goto menu

    :add_routes
    for %%a in (%routes%) do (
    route -p add %%a mask 255.255.255.0 !gateway#%ID%!
    echo 已添加路由: %%a !gateway#%ID%!
    )

    echo. 添加完成
    timeout /t 50 >nul
    goto menu

    :delete_routes
    for %%r in (%routes%) do (
    route delete %%r
    echo 已删除路由: %%r
    )
    echo. 删除完成
    timeout /t 1 >nul
    goto :menu
    word2064128279
        7
    word2064128279  
    OP
       314 天前
    @xxbdh 可以了,谢谢大佬。我照着学习下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3416 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:45 · PVG 19:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.