2015-10-09 1 views
-1

Hi - J'essaie de créer une boucle imbriquée avec 3 catégories de variables. La boucle imbriquée fonctionne bien si je prends des variables "normales" mais ce que je veux faire est de combiner toutes les variables. Il devrait parcourir tous les Markets-Variables, puis trouver et remplacer du texte qui est également lié au marché. Le problème est de concaténer les variables dans la boucle for - besoin d'aide s'il vous plaît!concaténer des variables dans une boucle imbriquée

Merci beaucoup!

:: set market array variables 
SET MARKET[1]=DE 
:: 14 more variables ... 

:: set find text array variables 
SET %MARKET[1]%FTEXT[1]=_1_ 
:: 29 more variables ... 

:: set replace text array variables 
SET %MARKET[1]%RTEXT[1]=_2_ 
:: 29 more variables ... 

FOR /L %%M IN (1,1,15) DO (
    ECHO ================== 
    ECHO Renaming market !MARKET[%%M]! 
    ECHO ================== 
    FOR /L %%T IN (1,1,30) DO (
    ECHO Renaming text from !MARKET[%%M]!!FTEXT[%%T]! to !MARKET[%%M]!!RTEXT[%%T]! 
    :: ACTION FOR RENAMING 
    PAUSE 
) 
) 
+1

Je ne sais pas ce que vous voulez dire. Avez-vous mis un "setlocal enabledelayedexpansion" dans le haut de votre script? –

+0

S'il vous plaît dites-moi, avez-vous l'intention de créer des variables nommées comme 'DEFTEXT [1]', 'DERTEXT [1]', ... ('DE' étant la valeur de' MARKET [1] '), ou faites-vous réellement voulez-vous que les variables de recherche/remplacement s'appellent 'MARKET [1] FTEXT [1]', 'MARKET [1] RTEXT [1]', ...? – aschipfl

Répondre

0

Vos find variables ont des noms comme DEFTEXT [1] si !MARKET[%%M]!!FTEXT[%%T]! a eu tort parce qu'il se développe pour DE et FTEXT[1] séparément, et puisque vous n'avez pas FTEXT[1] rien arrivé utile.

Solution: construire le nom de la variable correcte et puis développez, je l'ai utilisé call set truc pour cela, voici votre boucle interne:

setlocal enableDelayedExpansion 
call set "from=%%!MARKET[%%M]!FTEXT[%%T]%%" 
call set "to=%%!MARKET[%%M]!RTEXT[%%T]%%" 
ECHO Renaming text from !from! to !to! 
rem ACTION FOR RENAMING 
................... 
................... 
endlocal 

Notez que les variables from et to existent seulement à l'intérieur setlocal .. . endlocal contexte. En outre avoid using :: comments à l'intérieur des blocs entre parenthèses, utilisez plutôt rem.

+0

Hey - merci beaucoup pour la réponse. Ceci est exactement ce que je cherchais. Le "call set" résolvait le problème. Oui, j'ai oublié d'annoncer le SETLOCAL EnableDelayedExpansion ici mais c'était dans le script original. L'idée principale était de l'avoir un peu plus générique, c'est la raison pour laquelle j'ai fait cette combinaison de variables. Il peut y avoir jusqu'à 15 "Markets" avec des noms inconnus et pour chaque marché il peut y avoir jusqu'à 30 variables chacune pour FIND et REPLACE. Quelle est la différence entre :: et rem pour les commentaires? – HiKO

+0

@HiKO, cette réponse que j'ai liée contient une explication, vous pouvez regarder d'autres réponses là aussi. – wOxxOm

0

vous besoin d'une autre couche d'expansion:

call ECHO Renaming text from %%!MARKET[%%M]!FTEXT[%%T]%% to %%!MARKET[%%M]!RTEXT[%%T]%% 

(bien sûr aussi setlocal enabledelayedexpansion - non représenté sur votre question, mais vous avez probablement dans votre code d'origine)

0

Vous devez développer les trois les variables qui comprennent les anciens et les nouveaux noms avant en les utilisant pour obtenir les noms. J'ai utilisé un FOR /F pour faire cela; cette méthode run plus rapide que CALL:

FOR /L %%M IN (1,1,15) DO (
    ECHO ================== 
    ECHO Renaming market !MARKET[%%M]! 
    ECHO ================== 
    FOR /L %%T IN (1,1,30) DO (
    FOR /F "TOKENS=1-3" %%A IN ("!MARKET[%%M]! !FTEXT[%%T]! !RTEXT[%%T]!") DO (
     ECHO Renaming text from !%%A%%B! to !%%A%%C! 
     :: ACTION FOR RENAMING 
    ) 
    PAUSE 
) 
) 

Notez également que la première variable a juste besoin d'être élargie dans la boucle extérieure:

FOR /L %%M IN (1,1,15) DO FOR /F %%A IN ("!MARKET[%%M]!") DO (
    ECHO ================== 
    ECHO Renaming market !MARKET[%%M]! 
    ECHO ================== 
    FOR /L %%T IN (1,1,30) DO (
    FOR /F "TOKENS=1-2" %%B IN ("!FTEXT[%%T]! !RTEXT[%%T]!") DO (
     ECHO Renaming text from !%%A%%B! to !%%A%%C! 
     :: ACTION FOR RENAMING 
    ) 
    PAUSE 
) 
) 

détails supplémentaires à Arrays, linked lists and other data structures in cmd.exe (batch) script

0

Bien que votre question est pas tout à fait clair, j'essaie de fournir une réponse appropriée (j'espère avoir extrait la bonne intention du script) ...

  1. SETLOCAL EnableDelayedExpansion est manquant (peut-être que vous l'avez dans votre code final si).
  2. Je suppose que votre recherche/remplacement variables sont destinées à être appelées MARKET[1]FTEXT[1]/MARKET[1]RTEXT[1], ... (dans votre code la première paire sera nommé DEFTEXT[1]/DERTEXT[1]DE est la valeur de la variable MARKET[1]). Pour le remplacement de chaîne, utilisez la syntaxe d'extension VARIABLE:find=replace (voir set /?). Cependant, ceci est un peu délicat lorsque les parties de chaîne find et replace sont contenues dans des variables indépendantes. J'ai mis en œuvre deux variantes - voir les remarques connexes REM dans le code ci-dessous.

Le code suivant est censé faire ce que vous essayez d'accomplir:

SETLOCAL EnableDelayedExpansion 

REM set market array variables 
SET MARKET[1]=DE 
:: 14 more variables ... 

REM set find text array variables 
SET FTEXT[1]=_1_ 
:: 29 more variables ... 

REM set replace text array variables 
SET RTEXT[1]=_2_ 
:: 29 more variables ... 

FOR /L %%M IN (1,1,3) DO (
    ECHO ================== 
    ECHO Renaming market !MARKET[%%M]! 
    ECHO ================== 
    FOR /L %%T IN (1,1,2) DO (
    ECHO Replacing text portion !FTEXT[%%T]! by !RTEXT[%%T]! 

    REM Use EITHER this code block for string replacement... 
    IF NOT "!FTEXT[%%T]!"=="" (
     CALL SET MARKET[%%M]=%%^^MARKET[%%M]:!FTEXT[%%T]!=!RTEXT[%%T]!%% 
    ) 

    REM ...OR use this one! 
    FOR /F "tokens=1* delims==" %%R in ("!FTEXT[%%T]!=!RTEXT[%%T]!") do (
     IF NOT "%%R"=="" (
     SET MARKET[%%M]=!MARKET[%%M]:%%R=%%S! 
    ) 
    ) 

    ECHO !MARKET[%%M]! 

    PAUSE 
) 
) 
ENDLOCAL