Definir Variável Global na Sub-rotina com IF no Windows Batch

2

Eu tenho o seguinte problema com a forma como o interpretador de cmd trabalha com variáveis. Eu não consigo trabalhar. Você pode me dizer o truque?

Problema: Eu chamo uma Sub-rotina com um Argumento no Arquivo em Lote. Dependente do valor do argumento, a sub-rotina dinamicamente cria uma string em uma variável. Essa variável deve ser usada no Main-Batch.

@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

Saída deste documento executado duas vezes:

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

Eu esperava a seguinte saída, mas como ??

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

Você pode me ajudar? Saudações morlogg

    
por Morlogg 01.04.2011 / 10:25

1 resposta

5

Use a expansão atrasada, por exemplo, coloque

setlocal enabledelayedexpansion

no início do seu lote e, em seguida, use

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

%dynamic% é expandido o instante cmd analisa o ciclo for completo; portanto, ele não pode pegar um valor que você definiu na sub-rotina (o que obviamente acontece dentro do loop).

    
por 01.04.2011 / 12:18

Tags