Вы пропустили первую команду SET. Линия
tap=C:\ny
должно быть
set tap=C:\ny
Когда вы используете переменную, которая изменяется внутри IF или FOR, ее значение должно быть расширено с помощью! Var! а не с% var%; в противном случае расширенное значение - это значение, которое переменная ПРЕЖДЕ ЧЕМ введите IF или FOR (это цель EnableDelayedExpansion). Например:
set var=Old value
if 1 == 1 (
set var=New value
echo With percent: %var%. With exclamation: !var!
)
Предыдущий сегмент шоу: With percent: Old value. With exclamation: New value
Дополнительный комментарий:
Хотя if NEWYORK == %region%
совпадает с if %region% == NEWYORK
при его выполнении, второй является привычным и более понятным с точки зрения программистов.
EDIT
Я немного изменил ваш код. Посмотрите на это:
setlocal enabledelayedexpansion
if /I %region% == NEWYORK (
set tap=C:\ny
REM cl IS NOT DEFINED HERE, BUT USED IN NEXT LINE
CALL :process %1 %2 !tap! !cl!
GOTO :EOF
)
if /I %region% == California (
if /I '%3' == 'sanfrancisco' (
set cl=c:\ca\sf\cl
set tap=c:\ca\sf\%2
echo !tap!, !cl!
pause
CALL :process %1 %2 !tap! !cl!
GOTO :EOF
)
if /I '%3' == 'LosAngeles' (
set tap=c:\ca\la
set cl=c:\ca\la\cl
echo !tap!, !cl!
pause
CALL :process %1 %2 !tap! !cl!
GOTO :EOF
)
set tap=c:\USA
set cl=c:\usa\cl
echo !tap!, !cl!
pause
CALL :process %1 %2 !tap! !cl!
GOTO :EOF
) else (
echo faiiiiiiiiiillllllllll
pause
GOTO :END
)
endlocal
GOTO :EOF