[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理for中怎样用if比较变量大小?

wmpdxm.dll文件有版本号为11.0.5721.5268  和 9.0.0.4507 这两个版本,现在把wmpdxm.dll文件的两个版本号信息分别读到atmp.txt、btmp.txt,用以下语句实现高版本覆盖低版本,


REM FOR /F "TOKENS=4 DELIMS= " %%K IN (TEMP\atmp.txt) DO FOR /F "TOKENS=4 DELIMS= " %%L IN (TEMP\btmp.txt) DO IF %%K GEQ %%L COPY /Y TEMP\%%I\wm11\%%J SP


比较大小时竟然认为9.0.0.4507 比11.0.5721.5268  ,而没有实现设计意图,难到把变量按字符串比较了?该怎么实现这个意图,请知道的给说下,谢谢!!

1,9.0.0.4507 和11.0.5721.5268 是非法数字,所以if执行字符比较
2,楼主是要只比较第一个点前面的数字,还是要逐个比较?
只比较第一对:
  1. @echo off
  2. set a=11.0.5721.5268
  3. set b=9.0.0.4507
  4. for /F "delims=. " %%a in ("%a%") do for /F "delims=. " %%b in ("%b%") do if %%a gtr %%b echo.大于
  5. pause
复制代码
版本号为4段4位数字,则:
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=11.0.5721.5268
  3. set b=9.0.0.4507
  4. for /F " tokens=1-4 delims=. " %%a in ("%a%") do for /F " tokens=1-4 delims=. " %%e in ("%b%") do (
  5. set a=000%%a
  6. set b=000%%b
  7. set c=000%%c
  8. set d=000%%d
  9. set e=000%%e
  10. set f=000%%f
  11. set g=000%%g
  12. set h=000%%h
  13. if "!a:~-4!!b:~-4!!c:~-4!!d:~-4!" gtr "!e:~-4!!f:~-4!!g:~-4!!h:~-4!" echo.大于
  14. )
  15. pause
复制代码
逐个进行比较:
  1. @echo off
  2. set a=11.0.5721.5268
  3. set b=9.0.0.4507
  4. for /F " tokens=1-4 delims=. " %%a in ("%a%") do for /F " tokens=1-4 delims=. " %%e in ("%b%") do (
  5. if %%a gtr %%e call:y
  6. if %%a==%%e if %%b gtr %%f call:y
  7. if %%a==%%e if %%b==%%f if %%c gtr %%g call:y
  8. if %%a==%%e if %%b==%%f if %%c==%%g if %%d gtr %%h call:y
  9. )
  10. pause&exit
  11. :y
  12. echo.大于
复制代码

或:
  1. @echo off
  2. set a=11.0.5721.5268
  3. set b=9.0.0.4507
  4. for /F " tokens=1-4 delims=. " %%a in ("%a%") do for /F " tokens=1-4 delims=. " %%e in ("%b%") do (
  5. if %%a leq %%e goto:eof
  6. if %%a==%%e if %%b leq %%f goto:eof
  7. if %%a==%%e if %%b==%%f if %%c leq %%g goto:eof
  8. if %%a==%%e if %%b==%%f if %%c==%%g if %%d leq %%h goto:eof
  9. )
  10. echo.大于
  11. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-26 17:46 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

哦,这样啊,谢了,非常谢谢.
实际操作中那个获取的版本号也是一个变量,
读取的文件版本号就存放在atmp.txtx文件里,而且有些文件没有版本号,批处理很麻烦
atmp.txtx文件里关于版本号信息如下样子:
W32i   DLL ENU  11.0.5721.5145 shp wmdmlog.dll

TOP

如没有版本号的样式如下:
-   -   -               -   - icrav03.rat

TOP

批处理使用wmic获取版本信息:
  1. @echo off
  2. for /f "skip=1" %%a in ('wmic datafile where Name^="D:\\rec\\mspaint.exe" get Version') do echo.版本信息为 %%a
  3. pause
复制代码
完整信息是:
  1. wmic datafile where Name="D:\\rec\\mspaint.exe" get Version
复制代码
也可以使用vbs脚本,使用GetVersion函数获取文件版本,例如:
  1. Function GetVersion(pathspec)
  2.    Dim fso, temp
  3.    Set fso = CreateObject("Scripting.FileSystemObject")
  4.    temp = fso.GetFileVersion(pathspec)
  5.    If Len(temp) Then
  6.       GetVersion = temp
  7.    Else
  8.       GetVersion = "无版本信息!"
  9.    End If
  10. End Function
  11. filepath = "D:\\rec\\mspaint.exe"
  12. msgbox filepath & " 的版本是 " & GetVersion(filepath)
复制代码
说明:han1为新文件,han2为原文件
  1. @echo off&setlocal enabledelayedexpansion
  2. set "han1=D:\rec\mspaint.exe"
  3. set "han2=%SYSTEMROOT%\system32\mspaint.exe"
  4. for %%a in (1 2) do call:xing %%a "!han%%a!"
  5. if not defined ye1 goto:gu
  6. if not defined ye2 goto:gu
  7. :han
  8. set/a n+=1
  9. if ye1_%n% gtr ye2_%n% goto:gu
  10. if ye1_%n%==ye2_%n% goto:han
  11. if %n% neq %xing% goto:han
  12. pause&exit
  13. :gu
  14. copy "%han1%" "%han2%"
  15. goto:eof
  16. :xing
  17. set han=%2&set han=!han:\=\\!
  18. for /f "skip=1" %%a in ('wmic datafile where Name^=%han% get Version') do (
  19. set ye=%%a&set ye%1=!ye:.= !&set xing=0
  20. for %%b in (!ye%1!) do set/a xing+=1&set ye%1_!xing!=%%b)
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-26 20:59 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表