批处理文件中的变量集不会显示

时间:2014-11-28 22:38:36

标签: variables batch-file

当我在记事本中执行此操作时,命令提示符不显示ping %ip% -t -l %package%,但它显示ping %ip% -t -l并且不显示包变量。

@echo off
set data=0
set package = -600

IF %data% == 0 (
    set /a package= %package% + 1600
    @echo ping %ip% -t -l %package%
    )

echo %package%
pause

我做错了什么?

1 个答案:

答案 0 :(得分:1)

批处理对SET语句中的空格敏感。 SET FLAG = N将名为“FLAG Space ”的变量设置为值“ Space N”

set "var=value"语法可确保批处理行上的任何尾随空格不包含在分配给var的值中。

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

请注意使用CALL ECHO %%var%%显示var

的更改值

所以:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /A data=0
set /A package=-600

IF %data% == 0 (
    set /a package=!package!+1600
    echo ping %ip% -t -l !package!
    )

echo %package%
pause

注意:setlocal语句通常应放在代码的开头。您发布的代码显然是一个剪辑,因为您似乎没有设置ip

set /a中的空格无关紧要,但即便如此,删除它们会养成习惯

在循环中使用语法Set /a时,

run-time使用parse-time值而不是var set /a var=var+1值,因此{{1} }和set /a var=var+1是等效的,但set /a var=!var!+1在循环为set /a var=%var%+1时使用var的值。

由于初始语句将echoing设置为parsed,因此第二个off上的前导@是多余的。