繁体   English   中英

如何提取Windows批处理文件中的版本号?

[英]How to extract version number in a Windows batch file?

我需要从字符串中提取Major,Minor和Revision数字,并且要实现这一点,我正在尝试使用'。'将字符串拆分为批处理文件。 字符作为分隔符。

例如:如果用户在命令提示符下输入1.0.2 ,我应该能够提取

  • 1-主要版本,
  • 0-次要版本和
  • 2-修订

我正在尝试使用FOR命令来实现此目的,但并没有通过。 谁能帮我解决提取问题

@ECHO OFF & SETLOCAL 
set /p "ReleaseVersion=Please specify the software release version : "

:nextVar
for /F "tokens=1* delims=." %%a in ("%ReleaseVersion%") do (
   set %%a
   set ReleaseVersion=%%b
)
if defined ReleaseVersion goto nextVar

@PAUSE

干得好...

@ECHO OFF & SETLOCAL 
set /p "ReleaseVersion=Please specify the software release version : "

for /F "tokens=1,2,3 delims=." %%a in ("%ReleaseVersion%") do (
   set Major=%%a
   set Minor=%%b
   set Revision=%%c
)

echo Major: %Major%, Minor: %Minor%, Revision: %Revision%

输入输出:

请指定软件发行版本:1.0.2

主修:1,辅修:0,修订:2

没有足够的声誉来发表评论。 发布答案,而不是:)

有一个有用的资源: http : //ss64.com/nt/syntax-substring.html

SET _test=123456789abcdef0

::Skip 7 characters and then extract the next 5

 SET _result=%_test:~7,5%
 ECHO %_result%          =89abc

使用此方法可以根据需要从字符串中提取子字符串。

更新:

获取字符在字符串中的位置

获得点位置后,可以使用上述方法从输入字符串中提取必要的部分。

我最近发现了一个有趣的技巧,该技巧允许在不使用for命令的情况下基于分隔符拆分字符串,因此我无法抗拒将其发布到此处的诱惑。 这个问题也代表了使用我的方法的另一种方式(将字符串分割成两个以上的不同变量)。 这里是:

@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%

这个职位的进一步细节。

编辑添加了一些说明

您可以在此处阅读split方法的完整说明。 但是,此答案还使用了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

这篇文章中详细解释了此子例程中使用的split方法,但是在此示例中,我在此处复制了相关部分并对其进行了修改:


请注意, 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"等等。

编辑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%

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM