在 CMD 脚本中使用 set 命令提取子字符串

Dor*_*rga 1 windows cmd batch-file

我不是 CMD Windows 脚本专家。

我正在尝试使用 set 命令提取版本号(出于内部原因我必须使用 set 命令)。

这是我在脚本中写的内容:

REM Branch is my input    
set Branch=7.8.1
set "MAJOR=%Branch:.=" & set "MINOR=%%Branch:.=" & set "PATCH=%"
echo MAJOR  =  %MAJOR%
echo MINOR  =  %MINOR%
echo PATCH  =  %PATCH%
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

set "MAJOR=7"   & set "MINOR=8"   & set "MINOR=17"   & set "PATCH=8"   & set "PATCH=1"
MAJOR  =  7
MINOR  =  17
PATCH  =  1
Run Code Online (Sandbox Code Playgroud)

我想要得到的是这样的:

>set "MAJOR=7"   & set "MINOR=8"  & set "PATCH=1"
>MAJOR  =  7
>MINOR  =  8
>PATCH  =  1
Run Code Online (Sandbox Code Playgroud)

Com*_*mpo 5

这是一个想法的一个小改编(最初在此外部站点线程中创建,并已在评论中明确链接) :

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set "Branch=7.8.1"
Set "Vars=Major Minor Patch" & Set "p=%%"
Set "v=%Vars: =" & Set "s=!Branch:*.=!" & Call Set "!v!=!p!Branch:.!s!=!p!" & Set "Branch=!s!" & Set "v=%" & Set "!v!=!s!"
Echo Major: %Major%, Minor: %Minor%, Patch: %Patch%
Pause
Run Code Online (Sandbox Code Playgroud)

  • `Set "s="` 也不需要初始化 `Set "v="` 变量...... (2认同)

Aac*_*ini 5

这是另一种也许更简单的方法:

@echo off
setlocal EnableDelayedExpansion

set "Branch=7.8.1"
set "MAJOR=%Branch:.=" & (if not defined MINOR (set "v=MINOR") else set "v=PATCH") & set "!v!=%"
echo MAJOR  =  %MAJOR%
echo MINOR  =  %MINOR%
echo PATCH  =  %PATCH%
Run Code Online (Sandbox Code Playgroud)

编辑 2021/12/20: 添加新方法

我认为这是最简单的方法:

@echo off
setlocal EnableDelayedExpansion

set "Branch=7.8.1"
set "MAJOR=%Branch:.=" & set "MINOR=!PATCH!" & set "PATCH=%"

echo MAJOR  =  %MAJOR%
echo MINOR  =  %MINOR%
echo PATCH  =  %PATCH%
Run Code Online (Sandbox Code Playgroud)