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

[文件操作] [已解决]如何创建一个备份和还原文件名的批处理?

本帖最后由 thp2008 于 2023-9-8 22:00 编辑

是这样的,比如,我在测试各种批量改名的批处理,可能由于写错了代码,把文件名改的面目全非,即使我之前备份了全部的文件名称,但是也无法还原,不知道那个文件名是对应的那个文件了。
所以,我在想,能不能创建一个MD5值 和文件名对应的备份列表,然后,再创建一个,根据这个备份列表去还原的批处理。这样就不会出现文件名和文件无法对应的问题了。
MD5值,对小文件可能速度较快,对大文件,感觉较慢,或者直接记录文件的大小和文件名对应,产生一个备份列表,如:back.txt 还原的时候,根据这个表格,先查询文件的大小,还原相对应的文件名称。
当然,这个可能会出现文件大小一模一样的情况,我们就先不考虑这种情况了。就以所以文件大小不一样去操作。

概括:
1、创建文件大小和文件名称对应的列表文件back.txt
2、还原,先查找的文件大小,再从back.txt列表中,找到对应大小的,文件名,进行还原文件名。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

备份,文件大小大于n则记录文件大小,否则记录md5,不考虑大文件大小相同。
  1. @echo off
  2. set /a n=10*1024*1204
  3. (for /r %%i in (*) do (
  4. if "%%i" neq "%~f0" (
  5. if %%~zi gtr %n% (
  6. echo %%~zi^|%%~nxi
  7. ) else (
  8. for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do echo %%a^|%%~nxi
  9. )
  10. )
  11. ))>back.txt
  12. pause
复制代码


恢复
  1. @echo off
  2. set /a n=10*1024*1204
  3. for /r %%i in (*) do (
  4. if "%%i" neq "%~f0" if "%%i" neq "%~dp0back.txt" (ren "%%i" "%%~nxi.$")
  5. )
  6. for /r %%i in (*.$) do (
  7. if %%~zi gtr %n% (
  8. for /f "tokens=1* delims=|" %%f in ('find "%%~zi|" ^<back.txt') do ren "%%i" "%%g"
  9. ) else (
  10. for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do (
  11. for /f "tokens=1* delims=|" %%f in ('find "%%a|" ^<back.txt') do ren "%%i" "%%g"
  12. )
  13. )
  14. )
  15. pause
复制代码
1

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 thp2008 于 2023-9-8 21:38 编辑

感谢 77七  非常棒,我多次测试,效果很好,非常感谢!
要在在备份和恢复中,能排除*.bat和back.txt就更完美了。
恢复的时候,会把backup.bat,自动改名成backup.bat.$。

TOP

本帖最后由 thp2008 于 2023-9-8 21:32 编辑

我能不能,将这种批处理,设置成内置命令的方式运行,比如,我设置批处理的名字为不冲突的文件名,在系统Path中,设置它的所在的路径,但是,我在命令提示符下,运行,这种批处理的时候,它能不能在批处理前面,加上一个什么 pushd  %~dp0 什么的,运行的时候,自动切换到我运行的目录,仅限我的当前目录,运行完后,返回。这种我还没有操作过,一般是需要在批处理前面和后面各加什么语句?

比如:
备份:backmd5.bat
恢复:huifumd5.bat

放在D:\Tools\下面

我在Path=D:\Tools;%path%增加这个路径。
这样以后,我在测试各种批处理的时候,就可以直接运行backmd5来将文件名,备份一下。不用复制来,复制去。

TOP

回复 1# thp2008


    推荐在虚拟机(比如VirtualBox或者VMware)里面测试危险的代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复  thp2008


    推荐在虚拟机(比如VirtualBox或者VMware)里面测试危险的代码
Batcher 发表于 2023-9-8 21:52


谢谢提醒,有危险性的,我会在虚拟机里测试,只是一般的,我也会弄个测试目录去测试。这种东西,肯定要小心,一不小心,就全没了。

TOP

本帖最后由 77七 于 2023-9-8 22:31 编辑

回复 4# thp2008


  1. @echo off
  2. rem cmd 窗口执行 bh.bat back
  3. rem cmd 窗口执行 bh.bat huifi
  4. set /a n=10*1024*1204
  5. echo %~1
  6. goto :%~1
  7. exit /b
  8. :back
  9. (for /r %%i in (*) do (
  10. if /i not "%%~xi" equ ".bat" (
  11. if %%~zi gtr %n% (
  12. echo %%~zi^|%%~nxi
  13. ) else (
  14. for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do echo %%a^|%%~nxi
  15. )
  16. )
  17. ))>"%temp%\back.txt"
  18. echo done
  19. "%temp%\back.txt"
  20. exit /b
  21. :huifu
  22. if not exist "%temp%\back.txt" (
  23. exit /b
  24. )
  25. for /r %%i in (*) do (
  26. if /i not "%%~xi" equ ".bat" (
  27. ren "%%i" "%%~nxi.$"
  28. )
  29. )
  30. for /r %%i in (*.$) do (
  31. if %%~zi gtr %n% (
  32. for /f "tokens=1* delims=|" %%f in ('find "%%~zi|" ^<"%temp%\back.txt"') do ren "%%i" "%%g"
  33. ) else (
  34. for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do (
  35. for /f "tokens=1* delims=|" %%f in ('find "%%a|" ^<"%temp%\back.txt"') do ren "%%i" "%%g"
  36. )
  37. )
  38. )
  39. echo done
  40. exit /b
复制代码


恢复之后不会删除back.txt,备份一次,可以多次恢复。不考虑 ”大文件“ 大小相同,不考虑0字节文件。
1

评分人数

    • thp2008: 这种方式,很好,还支持中文文件名技术 + 1
bat小白,请多指教!谢谢!

TOP

加上一个什么 pushd  %~dp0 什么的

站内搜一下,给鼠标右键菜单添加 打开cmd,直接在需要的目录下打开cmd窗口执行就行了。
bat小白,请多指教!谢谢!

TOP

站内搜一下,给鼠标右键菜单添加 打开cmd,直接在需要的目录下打开cmd窗口执行就行了。
77七 发表于 2023-9-8 22:38


再次表示感谢!辛苦了!

TOP

返回列表