批处理:变量分配和比较
Batch: Variable assign and compare
我有一个简单的 Batch,它获取我的 Wifi IP 并将 public 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
我打开回显进行调试并注意到以下内容:
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,为什么它使用上一次迭代的值?
我关心的路线 table 如下:
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
您需要使用在顶部的 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
在上面的更新中,请注意需要在每次迭代中评估的变量是如何包装在 !
中的。这是延迟扩展的表示法。如果它们留在 %
中,那么它们只会在循环开始时被评估,并且不会在每次迭代时更新。
我有一个简单的 Batch,它获取我的 Wifi IP 并将 public 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
我打开回显进行调试并注意到以下内容:
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,为什么它使用上一次迭代的值?
我关心的路线 table 如下:
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
您需要使用在顶部的 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
在上面的更新中,请注意需要在每次迭代中评估的变量是如何包装在 !
中的。这是延迟扩展的表示法。如果它们留在 %
中,那么它们只会在循环开始时被评估,并且不会在每次迭代时更新。