使用批处理,我希望能够将变量分成两个或三个部分,当有一个符号将它们分开时。例如,如果我有这样的字符串:var1;var2;
我怎样才能让 var1 成为变量,而 var2 成为不同的变量。
提前致谢
使用批处理,我希望能够将变量分成两个或三个部分,当有一个符号将它们分开时。例如,如果我有这样的字符串:var1;var2;
我怎样才能让 var1 成为变量,而 var2 成为不同的变量。
提前致谢
将变量拆分为数组(或 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%
条线,让美好时光滚滚而来。
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 (