批处理:变量分配和比较

时间:2015-01-23 13:22:05

标签: batch-file

我有一个简单的批量获取我的Wifi IP并将特定的公共IP路由添加到WiFi。我的WiFi的前缀为10.240(wip)。我遇到的问题似乎与代码中的语法有关。

我有以下内容:

@echo off
set wip=10.240
FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do (

    @echo on
    REM set localIp=%%i
    set ip=%%i
    set xwip=%ip:~0,6%

    IF "%wip%" == "%xwip%" (

        echo My IP:  %ip%
        route ADD 95.0.0.0 MASK 255.0.0.0 %ip%
        route ADD 54.0.0.0 MASK 255.0.0.0 %ip%
        goto :break
)

:break

我打开了echo以进行调试,并注意到以下内容:

set ip=10.240.1.103
set xwip=10.113
IF "10.240" == "10.113" (
echo My IP:  10.113.1.83
route ADD 95.0.0.0 MASK 255.0.0.0 10.113.1.83
route ADD 54.0.0.0 MASK 255.0.0.0 10.113.1.83

如果我将变量 %% i 设置为 ip ,为什么要使用上一次迭代的值?

我关注的路线表如下:

Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0       10.113.1.1      10.113.1.83     10
          0.0.0.0          0.0.0.0     10.240.1.254     10.240.1.103     25
          0.0.0.0          0.0.0.0     10.240.1.253     10.240.1.103     25

1 个答案:

答案 0 :(得分:4)

您需要使用在顶部的SETLOCAL命令中启用的延迟扩展,否则解析器会在启动时评估FOR循环的全部内容,而不是每次迭代时。

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set found=false
set wip=10.240
FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do (

    @echo on
    REM set localIp=%%i
    set ip=%%i
    set xwip=!ip:~0,6!

    IF "%wip%" == "!xwip!" (

        echo My IP:  !ip!
        route ADD 95.0.0.0 MASK 255.0.0.0 !ip!
        route ADD 54.0.0.0 MASK 255.0.0.0 !ip!

        set found=true
        goto :break
    )
)

:break
IF "%found%"=="true" (
    ECHO Found it.
) ELSE (
    ECHO Didn't find it.
)

ENDLOCAL

在上面的更新中,请注意每次迭代需要评估的变量如何包含在!中。这是延迟扩张的表示法。如果它们留在%中,那么它们只会在循环开始时被评估,并且不会在每次迭代时更新。