2014-11-28 5 views
0

Когда я делаю это в Блокноте, в командной строке не отображается 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

Попробуйте удалить пробелы в командах набора вокруг равных знаков. – marc

+0

Вы должны использовать 'Setlocal EnableDelayedExpansion' и ˙! Package! ˙ вместо'% package% 'всюду внутри' IF '% data% "==" 0 "(...)' command. [Подробнее ...] (http://ss64.com/nt/delayedexpansion.html) – JosefZ

ответ

1

Пакет чувствителен к пробелам в заявлении SET. SET FLAG = N устанавливает переменную с именем «FLAG Space» на значение «Space

Синтаксис 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, а не значение varparse-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 является избыточным.

Смежные вопросы