使用批处理,我希望能够将变量分成两个或三个部分,当有一个符号除以它们。例如,如果我有这样的字符串: VAR1; VAR2;
如何让var1变为变量,var2变为不同的变种。
先谢谢
答案 0 :(得分:11)
将变量拆分为数组(或者像Windows批处理可以模仿的那样接近数组)的最佳方法是将变量的值放入for
循环可以理解的格式中。没有任何开关的for
将逐字拆分,在csv-type分隔符(逗号,空格,制表符或分号)处拆分。
这比for /f
更合适,for
逐行循环而不是逐字循环,它允许拆分未知数量的元素的字符串。
这里基本上是如何使用setlocal enabledelayedexpansion
set idx=0
for %%I in ("%var:;=","%") do (
set "var[!idx!]=%%~I"
set /a "idx+=1"
)
循环进行分割。
;
重要的一部分是将","
替换为%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
环境变量的most graceful method。
这是一个更完整的演示,调用子程序来分割变量。
C:\Users\me\Desktop>test.bat
array[0] = one
array[1] = two
array[2] = three
array[3] = four
array[4] = five
以下是上述脚本的输出:
set string=%PATH%
只是为了好玩,尝试取消评论{{1}}行并让好时光滚动。
答案 1 :(得分:8)
Tokens=1,2
会创建两个for循环变量%%i
和%%j
&amp;将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
答案 2 :(得分:0)
如果仅出现“一个”,请更改该行
for /L %%I in (0, 1, %array.ubound%) do (
作者
for /L %%I in (0, 1, !array.ubound!) do (