当我在记事本中执行此操作时,命令提示符不显示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
我做错了什么?
答案 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
上的前导@
是多余的。