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

时间:2015-09-15 04:57:11

标签: windows batch-file command-line cmd

我需要从字符串中提取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

3 个答案:

答案 0 :(得分:5)

你去......

@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

答案 1 :(得分:3)

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

这是一个有用的资源: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

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

<强>更新

Get position of a character in a string

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

答案 2 :(得分:2)

我最近发现了一个有趣的技巧,允许基于分隔符分割字符串,而不使用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命令来更改&#34; Minor&#34;中的变量名称。到&#34;修订版&#34;设置次要变量值后;如果删除@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"等。
  • 使用延迟扩展!变量处理每个部分!组装最终表达式。此方法允许在原始%扩展%无法处理的位置插入引号和其他特殊字符(如百分号)。例如: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%