Stalker_AleX333, Попробуйте сначала так:
Код:

@Echo Off
cls
Set "A=Main"
Echo %A%
Call :Kuku
Echo %A%
Pause
Exit /B
:Kuku
Set "A=kuku"
Echo %A%
Exit /B
Потом вот так
Код:

@Echo Off
cls
Set "A=Main"
Echo %A%
Call :Kuku
Echo %A%
Pause
Exit /B
:Kuku
SetLocal
Set "A=kuku"
Echo %A%
EndLocal
Exit /B
Пара SetLocal - EndLocal позволяет "экранироваить" область видимости переменных. Переменные с одинаковыми именами в одной части программы не будут изменяться в другой части, то есть, внутри подпрограммы Вы можете объявлять переменные без боязни их переопределить в других частях программы.
Если у Вас длинный код, для читаемости и удобства написания можно оформить отдельные функционально обусловленные куски в виде процедур, при необходимости применяя SetLocal - EndLocal
А переменные в знаках ! - это уже другая песТня