批处理脚本中命令输出变量的子字符串提取求助
提取批处理变量中第二个小数点前的内容
我明白你想要从已经获取到的系统版本变量OSvar里,提取第二个小数点之前的部分——比如从6.2.9200拿到6.2,从10.0.19045拿到10.0。你已经成功用PowerShell命令把版本号存入变量,接下来可以试试这两种可靠的方法:
方法一:用for /f分割字符串(最直观通用)
批处理的for /f可以按指定分隔符拆分字符串,这里我们用.作为分隔符,提取前两个部分再拼接起来:
@echo off rem 先执行你原有的命令获取OSvar for /f "tokens=*" %%i in ('"powershell (Get-CimInstance Win32_OperatingSystem).version"') do set OSvar=%%i rem 提取第二个小数点前的内容 for /f "tokens=1,2 delims=." %%a in ("%OSvar%") do set "OSshort=%%a.%%b" rem 验证结果 echo 完整版本:%OSvar% echo 简化版本:%OSshort%
原理说明:
delims=.指定用小数点作为分隔符tokens=1,2表示取拆分后的第1和第2个部分,分别存入%%a和%%b- 最后用
%%a.%%b把两个部分拼接成我们需要的格式,不管版本号是两位主版本(比如6.2)还是三位(比如10.0)都能适配。
方法二:用字符串替换技巧(更简洁)
如果你喜欢更简洁的写法,可以利用批处理的字符串替换特性,直接去掉第二个小数点及后面的内容:
@echo off for /f "tokens=*" %%i in ('"powershell (Get-CimInstance Win32_OperatingSystem).version"') do set OSvar=%%i rem 替换后直接得到目标内容 set "OSshort=%OSvar:.="&REM %" echo 完整版本:%OSvar% echo 简化版本:%OSshort%
原理说明:
这个写法的本质是把第一个小数点替换为"&REM ,这样批处理会把第二个小数点及后面的内容当成注释(REM)忽略掉,最终剩下的就是第一个小数点之前的部分加上第一个小数点和第二个部分,正好是我们要的内容。
为什么你之前的方法失败?
- 你用的
set 新变量=%OSvar:~0,3%是固定截取前3个字符,只适合6.2.xxx这种长度的版本号,但遇到10.0.xxx时,会得到10.(少了最后一位),所以无法通用。 - 如果之前尝试用
delims但没成功,大概率是因为没有把变量%OSvar%用引号包裹作为for /f的输入对象,导致批处理无法正确识别字符串。
内容的提问来源于stack exchange,提问作者Chocobits
相关产品推荐
相关产品推荐

