我正在运行一个命令来获取程序的版本。
FOR /F "tokens=* USEBACKQ" %%F IN (`"%programpath%\bin\program" version`) DO (
set version_full=%%F
)
结果:
Program Final Type 6.6.8 (build v3425fw2f24)
程序最终类型部分可能会有所不同。此程序有多种类型。因此我需要使用正则表达式来查找版本。
我只需要从这个字符串中取出 6.6.8,并将其设置为名为“version_num”的变量。但如果只有三个数字,我实际上希望它是 6.6.8.0。
有时版本可以是 4 位数字...例如 6.6.8.2。如果是 4,我需要获取所有 4 个数字...或者如果是 3,则通过在末尾添加 0 使其成为 4。
我试过
findstr /R "[0-9].[0.9].[0.9]" %version_full%
但是我只是得到了整个字符串,我认为它是被空格分隔的,错误如下:
FINDSTR: Cannot open 6.6.8
因此显然没有找到它。
编辑:
我已经让它工作以告诉我它是否找到或未找到,但我仍然无法将实际找到的值放入变量中。
@echo off
set var1=Program One New 6.6.8 (build ee27a8rr43e)
set "regexp=.*[0-9].[0-9].[0-9].*"
echo %var1%
echo %regexp%
echo %var1%|findstr /r /C:"%regexp%" >nul 2>&1 && echo Found || echo Not found.
Found
答案1
我知道我正在让一个死线程起死回生,但我也有一些类似的要求,并最终用这里的批处理文件完成了它。我还对四个版本号进行了额外的检查。它可以被修改为检查 1 个或 2 个可用版本号并添加额外的零。
@echo off
set str=Program Final Type 6.7.8 (build v3425fw2f24)
REM set str=Program Final Type 6.7.8.9 (build v3425fw2f24)
echo Original: %str%
set str=%str:(=x%
set str=%str:)=x%
echo Replaced(): %str%
set final_str=
for %%a in (%str%) do (
echo %%a | FindStr /R "[0-9]*\.[0-9]*\." > nul 2>&1 && set final_str=%%a
)
echo Initial Version: %final_str%
for /F "tokens=1-4 delims=." %%b in ("%final_str%") DO if [%%e] EQU [] set final_str=%final_str%.0
echo Final Version: %final_str%
输出结果如下:
Original: Program Final Type 6.7.8 (build v3425fw2f24)
Replaced(): Program Final Type 6.7.8 xbuild v3425fw2f24x
Initial Version: 6.7.8
Final Version: 6.7.8.0
答案2
我只是为我知道会出现的两种产品变体编写了两个单独的函数……在这些函数中,我只是计算空格分隔的字符数量并提取数字。
不好……因为如果程序更改了名称……或版本命名约定,它就会被破坏。每当添加新变体时,我都需要考虑它。但现在它可以工作。但不敢相信批处理不支持正则表达式提取。真的很惊讶。