【问题标题】:How to extract version number in a Windows batch file?如何在 Windows 批处理文件中提取版本号?
【发布时间】:2015-12-11 05:37:59
【问题描述】:

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

【问题讨论】:

  • 这作为控制台/shell JavaScript 或 PowerShell 文件要容易得多。你改用批处理文件有什么原因吗?
  • 是的,我需要将其合并到我现有的批处理文件脚本中
  • 请注意:cmd.exe不是DOS

标签: windows batch-file command-line cmd


【解决方案1】:

给你...

@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

【讨论】:

  • 认为我弄错了令牌。感谢您的解决方案
【解决方案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 命令,以便在设置次要变量值后将变量名称从“次要”更改为“修订”;如果您删除@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。

【讨论】:

  • 很酷的技巧,但解释一下这个技术可能很有用,因为它可能对每个人都不是很明显(我需要几分钟)
  • 我喜欢最后一种方法(2018-02-18),使用简单,技术很棒
【解决方案3】:

没有足够的声望发表评论。而是发布答案:)

有一个有用的资源:@​​987654321@

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

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

【讨论】:

  • 如何使用“点”作为分隔符分割字符串
猜你喜欢
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2013-07-16
  • 2015-08-29
相关资源
最近更新 更多