Ustaw zmienną globalną w podprogramie za pomocą IF w pakiecie Windows

2

Mam następujący problem ze sposobem, w jaki cmd Interpreter działa ze zmiennymi. Nie mogę tego uruchomić. Czy możesz mi powiedzieć trik?

Problem: wywołuję podprogram z argumentem w pliku wsadowym. W zależności od wartości argumentu podprogram dynamicznie buduje łańcuch znaków w zmiennej. Zmiennej tej należy używać w partii głównej.

@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

Wyjście tego Sript wykonano dwa razy:

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

Spodziewałem się następujących wyników, ale jak?

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

Możesz mi pomóc ? pozdrowienia morlogg

Morlogg
źródło

Odpowiedzi:

6

Użyj opóźnionego rozszerzenia, tj. Put

setlocal enabledelayedexpansion

na początku partii, a następnie użyj

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

%dynamic%jest rozwinięty natychmiast cmd analizuje całą forpętlę; dlatego nie może odebrać wartości ustawionej w podprogramie (co oczywiście dzieje się w pętli).

Joey
źródło
Wow, wielkie dzięki! Właśnie tego szukam. To działa.
Morlogg,