增加批处理文件中以句点分隔的数字序列的最后一个
Incrementing the last of a period-separated sequence of numbers in a batch file
我有一个执行部分软件构建过程的批处理文件。它从构建系统中提取当前标签名称,并将其放入生成的 C 源文件中。如果源不是从标签构建的,它将获取最新标签的名称(形式为 1.2.34 或 1.23)。然后它将 "build number" 递增 1 并附加文本 "Development"。或者至少应该如此。这是我想出的:
REM Increment the release tag. This will only work for Vx.y.z type release tags.
for /f "delims=. tokens=1-3" %%A in ("!_lasttag!") do (
set /a lastv = %%C + 1
set "tag=%%A.%%B.!lastv! (Development)"
)
输入在 _lasttag
,输出在 tag
。
这适用于“x.y.zz
”形式的标签,但如果有人对“1.23
”形式的标签进行提交,则会失败。
有更好的方法吗?
理想情况下,我想要适用于以下任何版本编号情况的东西:
1.2
1.2.34
1.2.34.56
我的下一个想法(就如何执行此操作而言)是使用 FOR
遍历字符串以计算标记数,然后再次这样做,直到标记数达到最后一个标记。我最终得到了这个:
set _nvertags=0
for /f "delims=." %%A in ('echo !_lasttag!') do (
echo %%A
set /a _nvertags+=1
)
但不是循环三次(输入“1.2.34
”),它只循环 运行 一次,将 nvertags
设置为 1。显然我错过了某处某事...
for %%a in ("!_lasttag!") do for /f "delims=." %%b in ("%%~xa.0") do (
set /a "lastv=%%b+1"
set "tag=%%~na.!lastv! (Development)"
)
就当点数是一个带扩展名的文件名吧。获取扩展名,增加它并连接其余元素。
类似于 MC ND 解决方案,但没有额外的 FOR /F 循环。我使用子字符串操作来消除 "extension"
中的点
for %%V in ("!_lasttag!") do (
set "end=%%~xV"
set /a "end=!end:~1!+1"
set "tag=%%~nV.!end! (Development)"
)
我有一个执行部分软件构建过程的批处理文件。它从构建系统中提取当前标签名称,并将其放入生成的 C 源文件中。如果源不是从标签构建的,它将获取最新标签的名称(形式为 1.2.34 或 1.23)。然后它将 "build number" 递增 1 并附加文本 "Development"。或者至少应该如此。这是我想出的:
REM Increment the release tag. This will only work for Vx.y.z type release tags.
for /f "delims=. tokens=1-3" %%A in ("!_lasttag!") do (
set /a lastv = %%C + 1
set "tag=%%A.%%B.!lastv! (Development)"
)
输入在 _lasttag
,输出在 tag
。
这适用于“x.y.zz
”形式的标签,但如果有人对“1.23
”形式的标签进行提交,则会失败。
有更好的方法吗?
理想情况下,我想要适用于以下任何版本编号情况的东西:
1.2
1.2.34
1.2.34.56
我的下一个想法(就如何执行此操作而言)是使用 FOR
遍历字符串以计算标记数,然后再次这样做,直到标记数达到最后一个标记。我最终得到了这个:
set _nvertags=0
for /f "delims=." %%A in ('echo !_lasttag!') do (
echo %%A
set /a _nvertags+=1
)
但不是循环三次(输入“1.2.34
”),它只循环 运行 一次,将 nvertags
设置为 1。显然我错过了某处某事...
for %%a in ("!_lasttag!") do for /f "delims=." %%b in ("%%~xa.0") do (
set /a "lastv=%%b+1"
set "tag=%%~na.!lastv! (Development)"
)
就当点数是一个带扩展名的文件名吧。获取扩展名,增加它并连接其余元素。
类似于 MC ND 解决方案,但没有额外的 FOR /F 循环。我使用子字符串操作来消除 "extension"
中的点for %%V in ("!_lasttag!") do (
set "end=%%~xV"
set /a "end=!end:~1!+1"
set "tag=%%~nV.!end! (Development)"
)