字符串与小数比较

时间:2016-03-21 15:47:30

标签: batch-file decimal string-comparison

我要做的是让Shockwave在多台计算机上保持最新状态。我写过这个小批量脚本,但它没有用。当它找到shockwave它会告诉我他们要么没有版本,要么版本更新。当然我认为它与两个数字中的小数有关但我不完全确定??

:Check_Ver
FOR /F "tokens=2 delims==" %%I IN (
  'wmic datafile where "name='C:\\Windows\\SysWOW64\\Adobe\\Shockwave 12\\uninstaller.exe'" get version /format:list'
) DO SET "RESULT=%%I"

ECHO %RESULT%
IF /I %RESULT% GTR 12.2.4.194 GOTO :NEWERVERSION
IF /I %RESULT% EQU 12.2.4.194 GOTO :CORRECTVERSION
IF /I %RESULT% LSS 12.2.4.194 GOTO :OUTDATEDVERSION

2 个答案:

答案 0 :(得分:1)

:convert

这个例程可以解决问题。

我们的想法是在进行比较之前将版本字符串转换为前导零填充字符串。

setlocal/endlocal例程简单地将其第二个参数分成4个部分,并为每个部分添加1000,产生4个字符的结果,然后将4个单独的子字符串串在一起,前缀为任意“v”。它使用echo括号来保持环境清洁

主要部分尝试3个不同的版本号用于deomnstration目的。根据您对所选目标标签的解释方式(并使用%result%简单显示),它似乎对我很满意(“更新”意味着建议的版本比wait()中安装的版本更新 - 只需改变比较器以给出看起来更合乎逻辑的东西 - 安装的版本是???比指定的版本)

答案 1 :(得分:0)

在批处理/命令提示符中,小数点会导致比较被视为字符串,在这种情况下gtr lss`失败。您可以做的是在for循环之后将比较和接收的版本转换为扁平整数

:: turn the for loop's return value to an integer, replace all "." with ""
set "result=%result:.=%"

:: Then, change your fixed version "12.2.4.194" [assuming it's a static value]
:: to "1224194" and compare using your if commands.

新脚本[没有注意到@CristiFati提到的内容]:

:Check_Ver
FOR /F "tokens=2 delims==" %%I IN (
    'wmic datafile where "name='C:\\Windows\\SysWOW64\\Adobe\\Shockwave 12\\uninstaller.exe'" get version /format:list'
) DO SET "RESULT=%%I"

ECHO %RESULT%

set "result=%result:.=%"
IF /I %RESULT% GTR 1224194 GOTO :NEWERVERSION
IF /I %RESULT% EQU 1224194 GOTO :CORRECTVERSION
IF /I %RESULT% LSS 1224194 GOTO :OUTDATEDVERSION

旁注: 不影响任何事情,但整数比较不需要/I标志,并且命令本身不需要大写,没有区别但只是更容易看到。