2

У меня есть следующая проблема с тем, как интерпретатор cmd работает с переменными. Я не могу заставить его работать. Можете ли вы сказать мне трюк?

Проблема: я вызываю подпрограмму с аргументом в Batch-File. Зависит от того, какое значение имеет аргумент, подпрограмма динамически создает строку в переменной. Эта переменная должна использоваться в основной партии.

@echo off
set globalvar=text_two,text_one

FOR %%U IN (%globalvar%) DO (
call :SUBROUTINE %%U
echo Variable DYNAMIC after Subroutine: %dynamic%
)

goto :END

:SUBROUTINE
::This Subroutine should Build the VARIABLE depended on the Argument
echo Dynamic in SUB1: %1
IF /I %1==text_one (set dynamic=dynamic_text_example_one)
IF /I %1==text_two (set dynamic=dynamic_text_example_two)
goto:EOF


:END

Вывод этого скрипта выполнен дважды:

Dynamic in SUB1: text_two
Variable DYNAMIC after Subroutine:
Dynamic in SUB1: text_one
Variable DYNAMIC after Subroutine:

Dynamic in SUB1: text_two
Variable DYNAMIC after Subroutine: dynamic_text_example_one
Dynamic in SUB1: text_one
Variable DYNAMIC after Subroutine: dynamic_text_example_one

Я ожидал следующий вывод, но как ??

Dynamic in SUB1: text_two
Variable DYNAMIC after Subroutine: dynamic_text_example_two
Dynamic in SUB1: text_one
Variable DYNAMIC after Subroutine: dynamic_text_example_one

Dynamic in SUB1: text_two
Variable DYNAMIC after Subroutine: dynamic_text_example_two
Dynamic in SUB1: text_one
Variable DYNAMIC after Subroutine: dynamic_text_example_one

Вы можете мне помочь ? С уважением, Morlogg

1 ответ1

6

Используйте отложенное расширение, т.е.

setlocal enabledelayedexpansion

в начале вашей партии, а затем использовать

FOR %%U IN (%globalvar%) DO (
  call :SUBROUTINE %%U
  echo Variable DYNAMIC after Subroutine: !dynamic!
)

%dynamic% раскрывается, когда cmd анализирует полный цикл for ; поэтому он не может подобрать значение, которое вы установили в подпрограмме (что, очевидно, происходит внутри цикла).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .