我最近发现了一个有趣的技巧,它允许基于分隔符在不使用for 命令的情况下拆分字符串,所以我无法抗拒在此处发布它的诱惑。这个问题也代表了使用我的方法的不同方式(将字符串拆分为超过 2 个不同的变量)。这里是:
@echo off
setlocal EnableDelayedExpansion
set /p "ReleaseVersion=Please specify the software release version : "
set "v=Minor"
set "Major=%ReleaseVersion:.=" & (if defined Minor set v=Revision) & set "!v!=%"
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%
更多详情请访问this post。
编辑:添加了一些解释
您可以阅读拆分方法的完整描述here。但是,此答案还使用if defined Minor 命令,以便在设置次要变量值后将变量名称从“次要”更改为“修订”;如果您删除@echo off 命令并查看跟踪输出,这一点很容易理解。
虽然此方法允许定义两个以上不同名称的变量,但为每个附加变量插入一个& (if defined prevVar set v=newVar) 命令有点麻烦。例如:
@echo off
setlocal EnableDelayedExpansion
set "str=1.0.2.25"
set "v=Minor"
set "Major=%str:.=" & (if defined Minor set v=Revision) & (if defined Revision set v=Subrev) & set "!v!=%"
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
一个字符串在几个不同的变量中的拆分可以在子程序的帮助下以更好的方式实现:
@echo off
setlocal EnableDelayedExpansion
call :SplitString "1.0.2.35" Major Minor Revision Subrev
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
goto :EOF
:SplitString string varName ...
rem Get string in "str" variable
set "str=%~1"
rem Create "v" array with variable names
set i=0
for %%a in (%*) do (
set "v[!i!]=%%a"
set /A i+=1
)
rem Separate the string in individual variables
set "p=%%"
set i=1
set "!v[1]!=%str:.=" & set /A i+=1 & call set "!p!v[!i!]!p!=%"
exit /B
该子程序中使用的拆分方法在this post中有详细说明,但我在这里复制了相关部分并针对此示例进行了修改:
请注意,call set "!p!v[!i!]!p!=%" 部分是一个嵌套替换,它与原始替换的每个子字符串一起执行。这样一来,该方法分为三个阶段:
- 原始字符串通过第一个 %str% 扩展拆分为多个部分,例如:
call set "!p!v[!i!]!p!=1"、call set "!p!v[!i!]!p!=0" 等。
- 每个部分都使用延迟扩展处理!变量!组装最终的表达式。此方法允许在原始 %expansion% 无法处理的位置插入引号和其他特殊字符,例如百分号。例如:
call set "%v[1]%=1"、call set "%v[2]%=0"等。
- 每个部分的最终表达式通过嵌套的 CALL 命令求值,例如:
set "Major=1"、set "Minor=0" 等。
EDIT 2018/02/18: 添加了新方法
我开发了一种新方法,该方法允许仅使用一行将值分配给不同的变量。这种方法是新的,因为它允许在同一行/替换中拆分 两个变量:
@echo off
setlocal EnableDelayedExpansion
set "str=1.0.2.25"
set "vars=Major Minor Revision Subrev"
set "p=%%"
set "v=%vars: =" & set "s=!str:*.=!" & call set "!v!=!p!str:.!s!=!p!" & set "str=!s!" & set "v=%" & set "!v!=!s!"
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
EDIT 2022/01/05: 添加了新的更简单的方法
我开发了一种新方法来实现这种拆分,它更简单,因为它除了变量名之外没有引入其他元素:
@echo off
setlocal
set "str=1.0.2.25"
set "Major=%str:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Major: %Major%, Minor: %Minor%, Revision: %Revision%, Subrev: %Subrev%
在本例中,使用了更简单的set /A 命令。如果分配的值不是数字,只需通过三个标准 set 命令更改单个 SET /A。