2014-10-03 5 views
0

Я не понимаю, в чем проблема с синтаксисом этого сценария:блок кода в пакетном файле

@echo off 
set a=1 
set b=2 
cd d:\ 
if %a% equ 1 (
    set a=%b% 
    set b=5 
    echo in a: %a% 
    echo in b: %b% 
) 
echo out a: %a% 
echo out b: %b% 
pause 
exit /b 

я получаю этот результат:

in a: 1 
in b: 2 
out a: 2 
out a: 5 

Я хотел бы получить следующий результат :

in a: 2 
in b: 5 
out a: 2 
out a: 5 

ответ

1

Когда пакетный файл выполняется, строки/блоки обрабатываются, выполняются, и процесс продолжается в следующей строке/блоке. Когда парсер достигает строки или блока кода, все ссылки %variable% заменяются значением внутри переменной до, начиная с выполнения кода. Таким образом, если вы измените значение переменной внутри блока кода, это новое значение не будет доступно изнутри одного и того же блока кода: операция чтения для переменной не существует, она была заменена значением внутри переменной.

Вам необходимо включить замедленное расширение и, при необходимости, изменить синтаксис, чтобы получить доступ к значению в переменной от %var% до !var!. Это указывает парсеру, что операция чтения должна быть отложена до выполнения операции чтения.

@echo off 
    setlocal enabledelayedexpansion 
    set a=1 
    set b=2 
    cd d:\ 
    if %a% equ 1 (
     set a=%b% 
     set b=5 
     echo in a: !a! 
     echo in b: !b! 
    ) 
    echo out a: %a% 
    echo out b: %b% 
    pause 
    exit /b 
Смежные вопросы