Board logo

标题: [文本处理] 如何用robocopy备份整盘小于10k的zip和rar [打印本页]

作者: netdzb    时间: 2019-6-14 08:34     标题: 如何用robocopy备份整盘小于10k的zip和rar

包括子目录上的,批处理实现自动备份到某个文件夹。
如果遇到相同文件名,自动将目标文件名改名。
作者: Batcher    时间: 2019-6-14 12:19

自动将目标文件名改名成什么样子?
作者: netdzb    时间: 2019-6-14 12:46

回复 2# Batcher

-001好了。
作者: miqilaosu    时间: 2019-6-15 10:09

本帖最后由 miqilaosu 于 2019-6-15 15:57 编辑
  1. @echo off
  2. set "kb=d:"
  3. for /f "delims=" %%i in ('dir /a-d /b *.zip,*.rar /s') do (
  4. if "%%~zi" lss 10240 (
  5. if not exist "%kb%%%~pi%%~nxi" (
  6. echo F|xcopy "%%i" "%kb%%%~pi%%~nxi"
  7. ) else (
  8. echo F|xcopy "%%i" "%kb%%%~pi%%~ni-001%%~xi"
  9. )
  10. )
  11. )
复制代码
这个只能在根目录下执行,d:是你要复制到的那个盘或目录,xcopy我没加属性,你根据自己的需求添加
如果你备份C盘的文件一定不要保存到C盘 不然有可能重复执行
%%~nxi这个是原文件名
%%~ni-001%%~xi这个是改后的文件名
%kb%%%~pi如果你要是不需要结构一样,就把这个直接换成你的目录就行,但是这样的话可能就会出现很多*.zip-001-001的文件,因为你不敢保证整个盘重名文件就两个
你这里有一点我没弄清楚 ,就是已存在文件改名;还是已存在文件不动,复制过去的文件改名。这两种不同,如果是已存在文件改名,就把else里的代码换成下面的代码:
  1. ren %kb%%%~pi%%~nxi %kb%%%~pi%%~ni-001%%~xi
  2. echo F|xcopy "%%i" "%kb%%%~pi%%~nxi"
复制代码
如果考虑到多次复制的话 重命名那里以后肯定会出问题,除非是将要复制到的文件夹名字有变化比如以日期命名的文件夹,也就是我这里的d:,或者说你可以直接用变量%%~ti获取文件的时间,我这里获取的是当前年月日
  1. @echo off
  2. set "kb=d:\1"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /a-d /b *.zip,*.rar /s') do (
  5. if "%%~zi" lss 10240 (
  6. if not exist "%kb%%%~pi%%~nxi" (
  7. echo F|xcopy "%%i" "%kb%%%~pi%%~nxi"
  8. ) else (
  9. set "date=!date:~0,10!
  10. set "date=!date:/=!"
  11. set "date=!date:-=!"
  12. ren %kb%%%~pi%%~nxi %kb%%%~pi%%~ni!date!%%~xi
  13. echo F|xcopy "%%i" "%kb%%%~pi%%~nxi"
  14. )
  15. )
  16. )
复制代码
这样如果复制到同一个目录每天执行一次的话也不会出错了
作者: netdzb    时间: 2019-6-15 18:02

本帖最后由 netdzb 于 2019-6-15 18:05 编辑

回复 4# miqilaosu

已经存在的文件不动,复制过去的文件改名应该如何操作?假设我某盘压缩包的主文件名相同的数量有好几个,压缩包里面的内容是不同的。
也就是相同的需要001,002,003的排序该怎么写代码?
谢谢!
作者: netdzb    时间: 2019-6-15 21:19

回复 4# miqilaosu

if "%%~zi" lss 10240
    ~~~~~
    代表什么意思?
作者: miqilaosu    时间: 2019-6-16 08:30

本帖最后由 miqilaosu 于 2019-6-16 14:41 编辑

回复 6# netdzb


    if %%~zi lss 10240

     因为%%i是文件,%%~zi就是文件大小
你可以在cmd里输入call /?  查询相关用法
这名的意思是如果%%~zi得到的字节小于10240(相当于10kb,1kb=1024b)
不要用引号,上边写引号的有问题
作者: miqilaosu    时间: 2019-6-16 10:39

本帖最后由 miqilaosu 于 2019-6-16 14:52 编辑

回复 2# Batcher
这个代码运行提示找不到%i,自己测试了下,是在第二个%i那出的错,但一直找不到问题所在,请版主大大帮忙看看
  1. @echo on
  2. set "kb=d:"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=*" %%i in ('dir /a-d /b *.zip,*.rar /s') do (
  5. set n=1001
  6. if %%~zi lss 10240 (
  7. if not exist "%kb%%%~pi%%~nxi" (
  8. echo,F|xcopy "%%i" "%kb%%%~pi%%~nxi" /e
  9. ) else (
  10. :cz
  11. if not exist "%kb%%%~pi%%~ni!n!%%~xi" (
  12. echo,F|xcopy "%%i" "%kb%%%~pi%%~ni!n:~1!%%~xi" /e /y
  13. ) else (
  14. set /a n+=1
  15. goto:cz
  16. )
  17. )
  18. )
  19. )
复制代码
上边的代码不知道为什么不能执行希望有大神解答,下边我用的笨办法做了一个,我想重名的文件不会超过50个吧,如果超过的话你自己改数吧,就是这样做执行起来太慢了点
  1. @echo off
  2. set "kb=d:\b"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=*" %%i in ('dir /a-d /b *.zip,*.rar /s') do (
  5. set n=1001
  6. if %%~zi lss 10240 (
  7. if not exist "%kb%%%~pi%%~nxi" (
  8. echo,F|xcopy "%%i" "%kb%%%~pi%%~nxi" /e
  9. ) else (
  10. for /l %%a in (1,1,50) do (
  11. if exist "%kb%%%~pi%%~ni-!n:~1!%%~xi" (
  12. set /a n+=1
  13. )
  14. )
  15. echo,F|xcopy "%%i" "%kb%%%~pi%%~ni-!n:~1!%%~xi"
  16. )
  17. )
  18. )
  19. )
复制代码
刚才FOR 循环忘了加/l报错了,这回加上了,我测试执行成功,还有之前我犯了个错误%%~zi,用引号引起来成了字符串对比,得到的文件大小不对,一定不能加引号




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