在嵌套循环中连接变量

时间:2015-10-09 08:14:05

标签: loops variables batch-file

嗨 - 我正在尝试使用3个变量类建立嵌套循环。 如果我正在使用“普通”变量,嵌套循环工作正常,但我想要做的是组合所有变量。 它应该贯穿所有Markets-Variables,然后查找和替换一些与市场相关的文本。 问题是在for循环中连接变量 - 需要一些帮助!

非常感谢!

:: 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
  )
)

4 个答案:

答案 0 :(得分:0)

您的find个变量的名称与DEFTEXT [1]相同,因此!MARKET[%%M]!!FTEXT[%%T]!错误,因为它分别扩展为DEFTEXT[1],因为您没有{ {1}}没有任何用处。

解决方案:构造正确的变量名,然后展开它,我已经使用了FTEXT[1]技巧,这是你最里面的循环:

call set

请注意,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 from变量仅存在于to ... setlocal上下文中。同样在括号内的avoid using :: comments内,请使用endlocal代替。

答案 1 :(得分:0)

你需要另一层扩张:

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

(当然也是setlocal enabledelayedexpansion - 未在您的问题中显示,但您可能在原始代码中有此内容)

答案 2 :(得分:0)

您需要在之前使用它们来扩展构成旧名称和新名称​​的三个变量,以获取名称。我使用FOR /F来做到这一点;此方法比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
  )
)

另外,请注意,第一个变量只需要在外部循环中展开:

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
  )
)

Arrays, linked lists and other data structures in cmd.exe (batch) script

的详细信息

答案 3 :(得分:0)

虽然你的问题不是很清楚,但我试着提供一个合适的答案(我希望我提取了剧本的正确用意)......

  1. SETLOCAL EnableDelayedExpansion遗失了(可能你在最后的代码中也有它)。
  2. 我认为您的查找/替换变量旨在被称为MARKET[1]FTEXT[1] / MARKET[1]RTEXT[1],...(在您的代码中,第一对将被命名为DEFTEXT[1] / {{1}其中DERTEXT[1]是变量DE)的值。
  3. 对于字符串替换,请使用MARKET[1]扩展语法(请参阅VARIABLE:find=replace)。但是,当set /?find字符串部分都包含在变量中时,这有点棘手。我实现了两个变体 - 请参阅下面代码中的相关备注replace
  4. 以下代码应该完成您要完成的任务:

    REM