Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理:变量赋值和比较_Batch File - Fatal编程技术网

Batch file 批处理:变量赋值和比较

Batch file 批处理:变量赋值和比较,batch-file,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 se

我有一个简单的批次,获取我的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
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
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
我打开echo进行调试,并注意到以下内容:

@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
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
如果我将变量%%I设置为ip,为什么要使用上一次迭代的值

我关心的路线表如下所示:

@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
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

在上面的更新中,请注意在每次迭代中需要计算的变量是如何包装在
中的。这是延迟扩展的符号。如果将它们保留在
%
中,则它们将仅在循环开始时进行计算,并且不会在每次迭代时进行更新。

您需要使用顶部的
SETLOCAL
命令中启用的延迟扩展,否则,解析器将在循环开始时而不是每次迭代时对循环的整个内容进行评估

@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

在上面的更新中,请注意在每次迭代中需要计算的变量是如何包装在
中的。这是延迟扩展的符号。如果将它们保留在
%
中,那么它们只会在循环开始时被计算,并且不会在每次迭代时更新。

这似乎起到了作用,但当我尝试使用echo进行调试时,变量会显式显示为批中写入的变量。例如:
设置xwip=!ip:~0,5
如果“10.25”==“!xwip!”(
,`My IP:!IP!`@Rick-如果您打开了
@echo,您将看到解析器将要计算的命令打印在屏幕上。这包括
符号,因为它尚未计算(由于延迟扩展)。但是输出应该是正确的。作为旁注,您的
IF
语句中缺少了一个结束语
,我在上面更新了该语句。好的,明白了。我正在尝试添加已找到的标志。考虑到这一点!表示法,如果我把它放在if中作为
set found=“true”
,如果我在:break之后立即进行比较,它会是:
if”%found%=“false”
?@Rick-我更新了答案,以显示如何使用
found
标志变量。我必须删除上一个if中的引号,但成功了<代码>如果%found%==true(
它似乎起了作用,但当我尝试使用echo调试时,变量会显式显示为批中写入的值。例如:
设置xwip=!ip:~0,5!
如果“10.25”==“!xwip!”(
,`My IP:!IP!`@Rick-如果您打开了
@echo
,那么您将看到屏幕上打印的解析器将要计算的命令。这包括
符号,因为它尚未计算(由于延迟扩展)。但是输出应该是正确的。作为旁注,我在上面更新的
IF
语句中缺少一个结束符
。好的,我正在尝试添加一个find标志。给定!符号,如果我将它放在IF As
set found=“true”
中,如果我在:break之后立即进行比较,它会是:
IF吗“%found%”==“false”
?@Rick-我更新了答案,以显示如何使用
found
标志变量。必须删除上一个if中的引号,但有效。
if%found%==true(
@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