Это должно делать то, что вы хотите:
set header1=appdef1.h
set header2=appdef2.h
set header3=appdef3.h
set headers=%header1% %header2% %header3%
for %%i in (%headers%) do echo %%i
pause
Ваш исходный код передал только 1 параметр как %% i, ваше исправление передало их как% 1,% 2% 3 в: lable, после чего они были выделены.
Мой код вызывает echo %% i один раз с каждым параметром.
c:\>set header1=appdef1.h
c:\>set header2=appdef2.h
c:\>set header3=appdef3.h
c:\>set headers=appdef1.h appdef2.h appdef3.h
c:\>for %i in (appdef1.h appdef2.h appdef3.h) do echo %i
c:\>echo appdef1.h
appdef1.h
c:\>echo appdef2.h
appdef2.h
c:\>echo appdef3.h
appdef3.h
c:\>pause
Press any key to continue . . .