找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29732|回复: 8

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

[复制链接]
发表于 2015-5-20 21:54:13 | 显示全部楼层 |阅读模式
本帖最后由 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通用,先谢过了!!
发表于 2015-5-21 01:11:52 | 显示全部楼层
试试 replace
发表于 2015-5-21 11:08:04 | 显示全部楼层
  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"
复制代码

评分

参与人数 1技术 +1 收起 理由
solan + 1 乐于助人

查看全部评分

发表于 2015-5-21 13:07:28 | 显示全部楼层
  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
复制代码
发表于 2015-5-21 15:02:31 | 显示全部楼层
回复 5# solan


    为什么要把第7行和第9行改成replnx_flexce?
 楼主| 发表于 2015-5-21 15:24:46 | 显示全部楼层
哦,替换错了,我在试试,谢谢
 楼主| 发表于 2015-5-21 15:56:52 | 显示全部楼层
本帖最后由 solan 于 2015-5-21 16:20 编辑

大哥,你太有才了,提取版本的写法是很难的哦,你能写出来太厉害了,辛苦你再完善一下
发表于 2015-5-21 18:17:25 | 显示全部楼层
"清除不干净" 是个什么意思?xcopy复制文件时只能覆盖,不能清除
 楼主| 发表于 2015-5-21 18:48:27 | 显示全部楼层
可以结贴了,谢谢各位!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 02:33 , Processed in 0.019862 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表