Пакет чувствителен к пробелам в заявлении SET
. SET FLAG = N
устанавливает переменную с именем «FLAG Space» на значение «Space N»
Синтаксис set "var=value"
гарантирует, что любые завершающие пробелы на пакетной линии не включены в стоимость присвоенного var
.
В пределах оператора блока (a parenthesised series of statements)
, блок всей анализируется и затем выполняются. Любой %var%
в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - то же самое относится к FOR ... DO (block)
.
Следовательно, 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
Принимая во внимание: The setlocal
заявление должно нормально быть помещен в начале кода. Ваш опубликованный код, очевидно, является срезом, поскольку вы, похоже, не устанавливаете ip
.
Пространство не имеет значения в set /a
, но даже в этом случае, удаление их способствует привычке
Set /a
использует значение run-time
, а не значение var
parse-time
, когда синтаксис set /a var=var+1
используется в цикле, поэтому set /a var=var+1
и set /a var=!var!+1
являются эквивалентно, но set /a var=%var%+1
использует значение var
во время цикла parsed
.
Поскольку эхосигнал установлен на off
начальным оператором, ведущий @
на втором echo
является избыточным.
Попробуйте удалить пробелы в командах набора вокруг равных знаков. – marc
Вы должны использовать 'Setlocal EnableDelayedExpansion' и ˙! Package! ˙ вместо'% package% 'всюду внутри' IF '% data% "==" 0 "(...)' command. [Подробнее ...] (http://ss64.com/nt/delayedexpansion.html) – JosefZ