8

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

我怎样才能让 var1 成为变量,而 var2 成为不同的变量。

提前致谢

4

3 回答 3

11

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

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

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

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

重要的部分是in的替换,;并将整个内容用引号括起来。事实上,这是最优雅的分割环境变量的方法。","%var%%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%条线,让美好时光滚滚而来。

于 2013-03-20T22:11:12.863 回答
10

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
于 2013-03-20T23:13:14.023 回答
0

如果您只出现“一个”,请更改该行

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

经过

for /L %%I in (0, 1, !array.ubound!) do (
于 2018-10-16T11:32:39.083 回答