You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在批处理文件中提取IPv4默认网关地址(排除IPv6)

问题描述

我的网络中有多个路由器,每个都有独立的IPv4地址,希望在批处理文件中保存该地址,方便在不同网络间切换时使用。

原命令:

for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^| findstr /i "Default Gateway"') do (set DG=%%i)

仅在只有IPv4地址时工作正常,但当同时存在IPv6地址(且在ipconfig /all输出中排在前面)时,即使调整tokens值也无法获取第二行的IPv4地址。

ipconfig /all输出示例:

Default Gateway . . . . . . . . . : fe80::2ac6:8eff:fe72:xxx%xx
                                     10.0.0.1

我仅需将第二行的IPv4地址保存到变量%DG%中,求无需使用PowerShell的解决方案,若PowerShell有简便方法也可接受。

我已尝试多种参数:如for /f "delims=" %%i、使用ALT+255作为分隔符匹配换行、调整tokens值(1到7及*)、设置LF和CR作为分隔符等,均无法获取第二行内容,只能正常获取第一行。

另外,我目前使用以下命令获取路由器网络的SSID:

for /f "tokens=3" %%i in ('netsh wlan show interface ^| findstr /i "SSID"') do (set assid=%%i) & goto NEXT

是否有其他命令可直接获取IPv4地址?


解决方案

批处理(CMD)方案

方法1:筛选IPv4格式地址

利用IPv4地址含.的特征,先提取所有默认网关相关行,再过滤出符合IPv4格式的内容:

@echo off
set "DG="
:: 遍历所有默认网关行
for /f "tokens=2 delims=:" %%a in ('ipconfig /all ^| findstr /i "Default Gateway"') do (
    :: 去掉地址前的空格
    for /f "tokens=*" %%b in ("%%a") do (
        :: 判断是否为IPv4格式(含数字和点)
        echo %%b | findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$" >nul && set "DG=%%b"
    )
)
:: 输出结果
echo 默认网关IPv4:%DG%

方法2:排除IPv6地址(含冒号)

直接过滤掉带冒号的行(IPv6地址特征),只保留IPv4地址行:

@echo off
set "DG="
for /f "tokens=2 delims=:" %%a in ('ipconfig /all ^| findstr /i "Default Gateway" ^| findstr /v ":"') do (
    for /f "tokens=*" %%b in ("%%a") do set "DG=%%b"
)
echo 默认网关IPv4:%DG%

PowerShell方案

PowerShell可以直接通过网络配置命令精准获取IPv4默认网关,无需处理文本输出:

方法1:简洁版

# 获取IPv4默认网关
$defaultGateway = (Get-NetIPConfiguration).IPv4DefaultGateway.NextHop
# 输出结果
Write-Host "默认网关IPv4:$defaultGateway"
# 可选:保存到用户环境变量,供批处理调用
[Environment]::SetEnvironmentVariable("DG", $defaultGateway, "User")

方法2:更严谨的路由查询

# 查询默认路由(0.0.0.0/0)的IPv4下一跳地址
$defaultGateway = Get-NetRoute -DestinationPrefix 0.0.0.0/0 | 
    Where-Object {$_.AddressFamily -eq 'IPv4'} | 
    Select-Object -ExpandProperty NextHop
Write-Host "默认网关IPv4:$defaultGateway"

额外问题:获取当前SSID的其他方法

除了netsh命令,PowerShell可以直接获取当前连接的网络名称:

$currentSSID = (Get-NetConnectionProfile).Name
Write-Host "当前连接SSID:$currentSSID"

内容的提问来源于stack exchange,提问作者Art

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:02:49