标题: [文件操作] 批处理for中怎样用if比较变量大小? [打印本页]
作者: huomayi 时间: 2010-5-26 16:34 标题: 批处理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 ,而没有实现设计意图,难到把变量按字符串比较了?该怎么实现这个意图,请知道的给说下,谢谢!!
作者: hanyeguxing 时间: 2010-5-26 16:58
1,9.0.0.4507 和11.0.5721.5268 是非法数字,所以if执行字符比较
2,楼主是要只比较第一个点前面的数字,还是要逐个比较?
只比较第一对:- @echo off
- set a=11.0.5721.5268
- set b=9.0.0.4507
- for /F "delims=. " %%a in ("%a%") do for /F "delims=. " %%b in ("%b%") do if %%a gtr %%b echo.大于
- pause
复制代码
版本号为4段4位数字,则:- @echo off&setlocal enabledelayedexpansion
- set a=11.0.5721.5268
- set b=9.0.0.4507
- for /F " tokens=1-4 delims=. " %%a in ("%a%") do for /F " tokens=1-4 delims=. " %%e in ("%b%") do (
- set a=000%%a
- set b=000%%b
- set c=000%%c
- set d=000%%d
- set e=000%%e
- set f=000%%f
- set g=000%%g
- set h=000%%h
- if "!a:~-4!!b:~-4!!c:~-4!!d:~-4!" gtr "!e:~-4!!f:~-4!!g:~-4!!h:~-4!" echo.大于
- )
- pause
复制代码
逐个进行比较:- @echo off
- set a=11.0.5721.5268
- set b=9.0.0.4507
- for /F " tokens=1-4 delims=. " %%a in ("%a%") do for /F " tokens=1-4 delims=. " %%e in ("%b%") do (
- if %%a gtr %%e call:y
- if %%a==%%e if %%b gtr %%f call:y
- if %%a==%%e if %%b==%%f if %%c gtr %%g call:y
- if %%a==%%e if %%b==%%f if %%c==%%g if %%d gtr %%h call:y
- )
- pause&exit
- :y
- echo.大于
复制代码
或:- @echo off
- set a=11.0.5721.5268
- set b=9.0.0.4507
- for /F " tokens=1-4 delims=. " %%a in ("%a%") do for /F " tokens=1-4 delims=. " %%e in ("%b%") do (
- if %%a leq %%e goto:eof
- if %%a==%%e if %%b leq %%f goto:eof
- if %%a==%%e if %%b==%%f if %%c leq %%g goto:eof
- if %%a==%%e if %%b==%%f if %%c==%%g if %%d leq %%h goto:eof
- )
- echo.大于
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-5-26 17:46 编辑 ]
作者: huomayi 时间: 2010-5-26 17:55
哦,这样啊,谢了,非常谢谢.
实际操作中那个获取的版本号也是一个变量,
读取的文件版本号就存放在atmp.txtx文件里,而且有些文件没有版本号,批处理很麻烦
atmp.txtx文件里关于版本号信息如下样子:
W32i DLL ENU 11.0.5721.5145 shp wmdmlog.dll
作者: huomayi 时间: 2010-5-26 18:00
如没有版本号的样式如下:
- - - - - icrav03.rat
作者: hanyeguxing 时间: 2010-5-26 19:25
批处理使用wmic获取版本信息:- @echo off
- for /f "skip=1" %%a in ('wmic datafile where Name^="D:\\rec\\mspaint.exe" get Version') do echo.版本信息为 %%a
- pause
复制代码
完整信息是:- wmic datafile where Name="D:\\rec\\mspaint.exe" get Version
复制代码
也可以使用vbs脚本,使用GetVersion函数获取文件版本,例如:- Function GetVersion(pathspec)
- Dim fso, temp
- Set fso = CreateObject("Scripting.FileSystemObject")
- temp = fso.GetFileVersion(pathspec)
- If Len(temp) Then
- GetVersion = temp
- Else
- GetVersion = "无版本信息!"
- End If
- End Function
- filepath = "D:\\rec\\mspaint.exe"
- msgbox filepath & " 的版本是 " & GetVersion(filepath)
复制代码
说明:han1为新文件,han2为原文件- @echo off&setlocal enabledelayedexpansion
- set "han1=D:\rec\mspaint.exe"
- set "han2=%SYSTEMROOT%\system32\mspaint.exe"
- for %%a in (1 2) do call:xing %%a "!han%%a!"
- if not defined ye1 goto:gu
- if not defined ye2 goto:gu
- :han
- set/a n+=1
- if ye1_%n% gtr ye2_%n% goto:gu
- if ye1_%n%==ye2_%n% goto:han
- if %n% neq %xing% goto:han
- pause&exit
- :gu
- copy "%han1%" "%han2%"
- goto:eof
- :xing
- set han=%2&set han=!han:\=\\!
- for /f "skip=1" %%a in ('wmic datafile where Name^=%han% get Version') do (
- set ye=%%a&set ye%1=!ye:.= !&set xing=0
- for %%b in (!ye%1!) do set/a xing+=1&set ye%1_!xing!=%%b)
复制代码
[ 本帖最后由 hanyeguxing 于 2010-5-26 20:59 编辑 ]
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |