【发布时间】:2013-03-20 21:48:51
【问题描述】:
使用批处理,我希望能够将变量分成两个或三个部分,当有一个符号将它们分开时。例如,如果我有如下所示的字符串: 变量1;变量2;
如何让 var1 变为变量,而 var2 变为不同的变量。
提前致谢
【问题讨论】:
标签: string batch-file
使用批处理,我希望能够将变量分成两个或三个部分,当有一个符号将它们分开时。例如,如果我有如下所示的字符串: 变量1;变量2;
如何让 var1 变为变量,而 var2 变为不同的变量。
提前致谢
【问题讨论】:
标签: string batch-file
将变量拆分为数组(或 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% 行,让美好时光滚滚而来。
【讨论】:
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
【讨论】:
如果你只有“一个”出现,换行
for /L %%I in (0, 1, %array.ubound%) do (
通过
for /L %%I in (0, 1, !array.ubound!) do (
【讨论】: