【问题标题】:Nested variable name using EnableDelayedExpansion使用 EnableDelayedExpansion 的嵌套变量名称
【发布时间】:2012-08-27 21:48:27
【问题描述】:

我正在编写一个脚本来获取每列的最大长度,我正在尝试将最大长度的长度存储在 _c1...n 变量中。列数未知。

我能够获取每列的长度,创建变量以使用 set _c!i! = !n!, n 是长度 但为了设置特定列的最大长度,我需要将 current 与 max 进行比较并使用类似 !_c!!i!!这不起作用,任何想法如何引用一个变量,它的名称的哪一部分来自另一个变量?

谢谢...

【问题讨论】:

    标签: batch-file variables cmd nested delayedvariableexpansion


    【解决方案1】:

    我假设您正在使用延迟扩展字符,因为您在一组括号“()”内工作。这样做会使您的过程更加困难。我知道这种方法更容易阅读,但编写代码却更难。

    在括号内,我只知道一种访问由一个或多个变量“构建”的变量的方法。也就是使用call 函数使组装变量“激活”。此方法在括号内和括号外都有效。

    这是一个小例子:

    @echo off
    setlocal enabledelayedexpansion
    (
      set i=10
      set _c!i!=something
      :: below is equivalent to echo !_c10!
      call echo %%_c!i!%%
    )
    endlocal
    

    输出:

    something
    

    你几乎可以在它前面使用CALL 来做任何没有它的事情,但是在XP 或更早版本中你不能调用像if 这样的内部命令,并且只能调用像FIND.EXE 这样的“外部”程序。

    如果您可以通过可能使用call :label 语句在一组括号之外工作,您可以像这样简单地访问变量:

    @echo off
    setlocal enabledelayedexpansion
    set i=10
    set _c!i!=something
    
    :: The below 2 statements are equivalent to `echo %_c10%`
    echo !_c%i%!
    call echo %%_c!i!%%
    
    endlocal
    

    输出:

    something
    something
    

    【讨论】:

      【解决方案2】:

      James K 建议的 CALL 技术会起作用,但它相对较慢并且可能不安全,具体取决于变量的内容。

      以下看起来更复杂,但它明显更快更可靠:

      for %%A in (!i!) do echo !_c%%A!
      

      【讨论】:

        【解决方案3】:

        如果您的变量仅包含数字,则可能有第三种解决方案。

        @echo off
        setlocal enabledelayedexpansion
        (
          set i=10
          set _c!i!=4711
        
          set /a tmp=_c!i!
          echo !tmp!
        )
        

        这是可行的,因为SET /A 可以访问变量的内容,而无需显式扩展字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-12
          • 1970-01-01
          • 2014-02-21
          • 2018-03-15
          • 2011-03-29
          相关资源
          最近更新 更多