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

thi*_*-Me 1 windows command-line cmd 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
Run Code Online (Sandbox Code Playgroud)

Rus*_*lan 6

干得好...

@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%
Run Code Online (Sandbox Code Playgroud)

输入输出:

请指定软件发行版本:1.0.2

专业:1,轻微:0,修订版:2


Aac*_*ini 6

我最近发现了一个有趣的技巧,它允许在不使用forcommand 的情况下根据分隔符拆分字符串,所以我无法抗拒将它张贴在这里的诱惑。这个问题也代表了使用我的方法的不同方式(将字符串拆分为 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%
Run Code Online (Sandbox Code Playgroud)

这篇文章的更多细节。

编辑添加了一些解释

您可以在此处阅读 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%
Run Code Online (Sandbox Code Playgroud)

借助子程序可以更好地将字符串拆分为多个不同的变量:

@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
Run Code Online (Sandbox Code Playgroud)

这个子程序中使用的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%
Run Code Online (Sandbox Code Playgroud)