Board logo

标题: [文件操作] [已解决]批处理怎样根据两文件的版本高低或大小来决定要不要复制并覆盖原文件? [打印本页]

作者: solan    时间: 2015-5-20 21:54     标题: [已解决]批处理怎样根据两文件的版本高低或大小来决定要不要复制并覆盖原文件?

本帖最后由 solan 于 2015-5-21 18:49 编辑

我的原意是这样的,如果不存在%AllUsersProfile%\A目录,就把%cd%\A整个文件夹和文件复制到%AllUsersProfile%,
如果存在,那么这个时候如果%AllUsersProfile%\A中没有1.exe文件,就彻底删除文件夹A,再把%cd%\A整个文件夹和文件复制到%AllUsersProfile%,
                      如果%AllUsersProfile%\A中存在1.exe文件,那么把它跟%cd%\A中的1.exe进行版本高低的比较:如果前者的版本低或同版本,就执行上面的复制;如果前者的版本高就不复制。
     但是,我不会提取文件版本,只好比大小了,批处理如下:
  1. if not exist "%AllUsersProfile%\A" (goto 11) else (if not exist "%AllUsersProfile%\A\1.exe" goto 22)
  2. for %%1 in (%AllUsersProfile%\A\1.exe) do set wind=%%~z1
  3. for %%1 in (%cd%\A\1.exe) do set snow=%%~z1
  4. if "%wind% equ %snow%" goto 22
  5. if "%wind% lss %snow%" goto 22
  6. :11
  7. xcopy /s/e/q/r/y "%cd%\A" "%AllUsersProfile%\A\"
  8. :22
  9. rmdir /s/q "%AllUsersProfile%\A"
  10. xcopy /s/e/q/r/y "%cd%\A" "%AllUsersProfile%\A\"
  11. pause
复制代码
但是这个代码不行,如果不存在%AllUsersProfile%\A目录倒能正常执行,一旦存在A\不管谁大小批处理立马闪退。后来我这样写,还是不行:
  1. md "%AllUsersProfile%\A\"
  2. if not exist "%AllUsersProfile%\A\1.exe" (goto 22) else (
  3. for %%1 in (%AllUsersProfile%\A\1.exe) do set wind=%%~z1
  4. for %%1 in (%cd%\A\1.exe) do set snow=%%~z1
  5. if "%wind% equ %snow%" goto 22
  6. if "%wind% lss %snow%" goto 22
  7. if "%wind% gtr %snow%" goto end
  8. :22
  9. rmdir /s/q "%AllUsersProfile%\A" >nul 2>nul
  10. xcopy /s/e/q/r/y "%cd%\A" "%AllUsersProfile%\A\" >nul 2>nul
  11. :end
  12. cls)
  13. pause
复制代码
在此恳请哪位老大帮忙改下代码,最好是通过两文件的版本高低比较来写代码,xp和win7通用,先谢过了!!
作者: terse    时间: 2015-5-21 01:11

试试 replace
作者: apang    时间: 2015-5-21 11:08

  1. @echo off
  2. set "dstFile=%AllUsersProfile%\A\1.exe"
  3. set "srcFile=%~dp0A\1.exe"
  4. >$ echo fso = new ActiveXObject("Scripting.FileSystemObject")
  5. >>$ echo v1 = fso.GetFileVersion("%dstFile:\=/%")
  6. >>$ echo v1 = v1.replace(/\d+/g,function(s0){return s0-0+100000000})
  7. >>$ echo v2 = fso.GetFileVersion("%srcFile:\=/%")
  8. >>$ echo v2 = v2.replace(/\d+/g,function(s0){return s0-0+100000000})
  9. >>$ echo WScript.Echo(v1 + " " + v2)
  10. if exist "%AllUsersProfile%\A\" (
  11.         if exist "%dstFile%" (
  12.                 for /f "tokens=1,2" %%1 in ('cscript -nologo -e:jscript $') do (
  13.                         if "%%1" LEQ "%%2" call :copy
  14.                 )
  15.         ) else (
  16.                 rd /s /q "%AllUsersProfile%\A\"
  17.                 call :copy
  18.         )
  19. ) else call :copy
  20. del $
  21. pause & exit/b
  22. :copy
  23. xcopy /s /e /q /r /y "%~dp0A\*" "%AllUsersProfile%\A\"
复制代码

作者: terse    时间: 2015-5-21 13:07

  1. @echo off
  2. if exist "%AllUsersProfile%\A\" (
  3.    if not exist "%AllUsersProfile%\A\1.exe" (
  4.       rd /s /q "%AllUsersProfile%\A\"
  5.       xcopy /e/q/r/y  "%cd%\A\" "%AllUsersProfile%\A\"
  6.    ) else  replace /u "%cd%\A\1.exe" "%AllUsersProfile%\A\"
  7. ) else xcopy /e/q/r/y "%cd%\A" "%AllUsersProfile%\A\"
  8. pause
复制代码

作者: apang    时间: 2015-5-21 15:02

回复 5# solan


    为什么要把第7行和第9行改成replnx_flexce?
作者: solan    时间: 2015-5-21 15:24

哦,替换错了,我在试试,谢谢
作者: solan    时间: 2015-5-21 15:56

本帖最后由 solan 于 2015-5-21 16:20 编辑

大哥,你太有才了,提取版本的写法是很难的哦,你能写出来太厉害了,辛苦你再完善一下
作者: apang    时间: 2015-5-21 18:17

"清除不干净" 是个什么意思?xcopy复制文件时只能覆盖,不能清除
作者: solan    时间: 2015-5-21 18:48

可以结贴了,谢谢各位!!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2