批量从行数中查找最高版本字符串

时间:2015-06-29 07:27:54

标签: batch-file

我需要确定批处理脚本中LocalDB安装版本最高的版本,并将整个版本字符串设置为变量。

sqllocaldb versions产生一个像:

的输出
Microsoft SQL Server 2012 (11.0.5058.0)
Microsoft SQL Server 2014 (12.0.2000.8)

版本字符串的顺序不一定是升序。需要一些帮助才能将最高服务器版本设置为变量(在此示例中为12.0.2000.8)。

2 个答案:

答案 0 :(得分:1)

您需要调用该命令并使用FOR命令和SET命令的组合解析返回的字符串,

for /f "tokens=5" %%a in ('sqllocaldb versions') do (
  set verstr=%%a
  set verstr=!verstr:^(=!
  set verstr=!verstr:^)=!

然后使用另一个FOR命令将版本字符串解析为片段,并使用SET /A和简单算术计算版本号

for /f "tokens=1,2,3 delims=." %%b in ("!verstr!") do (
  set /a verval=%%b*1000000+%%c*1000+%%d

然后使用IF GTR命令

将其与运行最大值进行比较
if !verval! gtr !highval! (
  set /a highval=!verval!
  set highest=!verstr!
)

<小时/> 所以,将所有部分放在一起......

@echo off
setlocal enabledelayedexpansion
set /a highval=0
for /f "tokens=5" %%a in ('sqllocaldb versions') do (
  set verstr=%%a
  set verstr=!verstr:^(=!
  set verstr=!verstr:^)=!
  for /f "tokens=1,2,3 delims=." %%b in ("!verstr!") do (
    set /a verval=%%b*1000000+%%c*1000+%%d
    if !verval! gtr !highval! (
      set /a highval=!verval!
      set highest=!verstr!
    )
  )
)
echo !highest!

答案 1 :(得分:1)

修改改进:无需辅助批处理脚本。下一个代码片段可以工作(注意适当的转义应用于内部循环):

@ECHO OFF
SETLOCAL enableextensions
echo show variables before
set _lastver

rem with an auxiliary batch script
>"%temp%\31110044.bat" ((for /f "tokens=1,2 delims=()" %%a in ('
  sqllocaldb versions
  ') do @echo @set "_lastverCall=%%b")|sort)
call "%temp%\31110044.bat"

rem using two nested 'for /F' loops: 
rem (note proper escaping applied to inner loop)
for /F "usebackq delims=" %%x in (`
  ^(for /f "tokens=1,2 delims=()" %%a in ^(^'
      sqllocaldb versions
      ^'^) do @echo %%b^)^|sort
`) do set "_lastverForF=%%x"

echo show variables after
set _lastver

<强>输出

==>D:\bat\SO\31110044.bat
show variables before
Environment variable _lastver not defined
show variables after
_lastverCall=12.0.2000.8
_lastverForF=12.0.2000.8

==>

使用type "files\31110044.txt"中的虚构值而不是sqllocaldb versions进行调试:

==>type "files\31110044.txt"
MiniSoft SQL Server 2012 (11.0.5058.0)
MiniSoft SQL Server 2014 ( 2.0.2000.4)
MiniSoft SQL Server 2013 (11.0.5046.0)
MiniSoft SQL Server 2014 (12.0.2000.8)
MiniSoft SQL Server 2014 (11.0.4046.6)

==>