【问题标题】:separating variable with a symbol into different parts用符号将变量分成不同的部分
【发布时间】:2013-03-20 21:48:51
【问题描述】:

使用批处理,我希望能够将变量分成两个或三个部分,当有一个符号将它们分开时。例如,如果我有如下所示的字符串: 变量1;变量2;

如何让 var1 变为变量,而 var2 变为不同的变量。

提前致谢

【问题讨论】:

    标签: string batch-file


    【解决方案1】:

    将变量拆分为数组(或 Windows 批处理可以模仿的尽可能接近数组)的最佳方法是将变量的值放入for 循环可以理解的格式。 for 不带任何开关将逐字分割一行,在 csv 类型的分隔符(逗号、空格、制表符或分号)处分割。

    这比for /f 更合适,for /f 是逐行循环而不是逐字循环,它允许拆分未知数量元素的字符串。

    这基本上是使用for 循环进行拆分的工作原理。

    setlocal enabledelayedexpansion
    set idx=0
    for %%I in ("%var:;=","%") do (
        set "var[!idx!]=%%~I"
        set /a "idx+=1"
    )
    

    重要的部分是将; 替换为"," 中的%var%,并将整个内容用引号括起来。确实,这就是most graceful method分割%PATH%环境变量的例子。

    这里有一个更完整的演示,调用一个子程序来拆分一个变量。

    @echo off
    setlocal enabledelayedexpansion
    
    set string=one;two;three;four;five;
    
    :: Uncomment this line to split %PATH%
    :: set string=%PATH%
    
    call :split "%string%" ";" array
    
    :: Loop through the resulting array
    for /L %%I in (0, 1, %array.ubound%) do (
        echo array[%%I] = !array[%%I]!
    )
    
    :: end main script
    goto :EOF
    
    
    :: split subroutine
    :split <string_to_split> <split_delimiter> <array_to_populate>
    :: populates <array_to_populate>
    :: creates arrayname.length (number of elements in array)
    :: creates arrayname.ubound (upper index of array)
    
    set "_data=%~1"
    
    :: replace delimiter with " " and enclose in quotes
    set _data="!_data:%~2=" "!"
    
    :: remove empty "" (comment this out if you need to keep empty elements)
    set "_data=%_data:""=%"
    
    :: initialize array.length=0, array.ubound=-1
    set /a "%~3.length=0, %~3.ubound=-1"
    
    for %%I in (%_data%) do (
        set "%~3[!%~3.length!]=%%~I"
        set /a "%~3.length+=1, %~3.ubound+=1"
    )
    goto :EOF
    

    这是上面脚本的输出:

    C:\Users\me\Desktop>test.bat
    array[0] = one
    array[1] = two
    array[2] = three
    array[3] = four
    array[4] = five
    

    只是为了好玩,尝试取消注释set string=%PATH% 行,让美好时光滚滚而来。

    【讨论】:

      【解决方案2】:

      Tokens=1,2 确实创建了两个 for 循环变量 %%i%%j& 将 string 分成两部分,由分隔符 ; 分隔:

      @echo off &setlocal
      set "string=var1;var2;"
      for /f "tokens=1,2 delims=;" %%i in ("%string%") do set "variable1=%%i" &set "variable2=%%j"
      echo variable1: %variable1%
      echo variable2: %variable2%
      endlocal
      pause
      

      对于更“动态”的方法,请使用:

      @echo off &setlocal enabledelayedexpansion
      set "string=var1;var2;"
      
      set /a count=0
      for %%i in (%string%) do (
          set /a count+=1
          set "variable!count!=%%i"
      )
      echo found %count% variables
      for /l %%i in (1,1,%count%) do (
          echo variable%%i: !variable%%i!
      )
      endlocal
      

      【讨论】:

      • 感谢您的回答,我现在有我需要的东西,但是为了将来参考,如果我想用很多部件进行很长的扩展,我怎样才能做到这一点而不必单独设置每个1 到 %%i,然后 %%j。
      【解决方案3】:

      如果你只有“一个”出现,换行

      for /L %%I in (0, 1, %array.ubound%) do (
      

      通过

      for /L %%I in (0, 1, !array.ubound!) do (
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        相关资源
        最近更新 更多