标题: [文件操作] [已解决]如何创建一个备份和还原文件名的批处理? [打印本页]
作者: thp2008 时间: 2023-9-8 18:18 标题: [已解决]如何创建一个备份和还原文件名的批处理?
本帖最后由 thp2008 于 2023-9-8 22:00 编辑
是这样的,比如,我在测试各种批量改名的批处理,可能由于写错了代码,把文件名改的面目全非,即使我之前备份了全部的文件名称,但是也无法还原,不知道那个文件名是对应的那个文件了。
所以,我在想,能不能创建一个MD5值 和文件名对应的备份列表,然后,再创建一个,根据这个备份列表去还原的批处理。这样就不会出现文件名和文件无法对应的问题了。
MD5值,对小文件可能速度较快,对大文件,感觉较慢,或者直接记录文件的大小和文件名对应,产生一个备份列表,如:back.txt 还原的时候,根据这个表格,先查询文件的大小,还原相对应的文件名称。
当然,这个可能会出现文件大小一模一样的情况,我们就先不考虑这种情况了。就以所以文件大小不一样去操作。
概括:
1、创建文件大小和文件名称对应的列表文件back.txt
2、还原,先查找的文件大小,再从back.txt列表中,找到对应大小的,文件名,进行还原文件名。
作者: 77七 时间: 2023-9-8 20:56
备份,文件大小大于n则记录文件大小,否则记录md5,不考虑大文件大小相同。- @echo off
- set /a n=10*1024*1204
- (for /r %%i in (*) do (
- if "%%i" neq "%~f0" (
- if %%~zi gtr %n% (
- echo %%~zi^|%%~nxi
- ) else (
- for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do echo %%a^|%%~nxi
- )
- )
- ))>back.txt
- pause
复制代码
恢复
- @echo off
- set /a n=10*1024*1204
- for /r %%i in (*) do (
- if "%%i" neq "%~f0" if "%%i" neq "%~dp0back.txt" (ren "%%i" "%%~nxi.$")
- )
- for /r %%i in (*.$) do (
- if %%~zi gtr %n% (
- for /f "tokens=1* delims=|" %%f in ('find "%%~zi|" ^<back.txt') do ren "%%i" "%%g"
- ) else (
- for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do (
- for /f "tokens=1* delims=|" %%f in ('find "%%a|" ^<back.txt') do ren "%%i" "%%g"
- )
- )
- )
- pause
复制代码
作者: thp2008 时间: 2023-9-8 21:22
本帖最后由 thp2008 于 2023-9-8 21:38 编辑
感谢 77七 非常棒,我多次测试,效果很好,非常感谢!
要在在备份和恢复中,能排除*.bat和back.txt就更完美了。
恢复的时候,会把backup.bat,自动改名成backup.bat.$。
作者: thp2008 时间: 2023-9-8 21:28
本帖最后由 thp2008 于 2023-9-8 21:32 编辑
我能不能,将这种批处理,设置成内置命令的方式运行,比如,我设置批处理的名字为不冲突的文件名,在系统Path中,设置它的所在的路径,但是,我在命令提示符下,运行,这种批处理的时候,它能不能在批处理前面,加上一个什么 pushd %~dp0 什么的,运行的时候,自动切换到我运行的目录,仅限我的当前目录,运行完后,返回。这种我还没有操作过,一般是需要在批处理前面和后面各加什么语句?
比如:
备份:backmd5.bat
恢复:huifumd5.bat
放在D:\Tools\下面
我在Path=D:\Tools;%path%增加这个路径。
这样以后,我在测试各种批处理的时候,就可以直接运行backmd5来将文件名,备份一下。不用复制来,复制去。
作者: Batcher 时间: 2023-9-8 21:52
回复 1# thp2008
推荐在虚拟机(比如VirtualBox或者VMware)里面测试危险的代码
作者: thp2008 时间: 2023-9-8 21:59
回复 thp2008
推荐在虚拟机(比如VirtualBox或者VMware)里面测试危险的代码
Batcher 发表于 2023-9-8 21:52
谢谢提醒,有危险性的,我会在虚拟机里测试,只是一般的,我也会弄个测试目录去测试。这种东西,肯定要小心,一不小心,就全没了。
作者: 77七 时间: 2023-9-8 22:26
本帖最后由 77七 于 2023-9-8 22:31 编辑
回复 4# thp2008
- @echo off
- rem cmd 窗口执行 bh.bat back
- rem cmd 窗口执行 bh.bat huifi
- set /a n=10*1024*1204
- echo %~1
- goto :%~1
- exit /b
- :back
- (for /r %%i in (*) do (
- if /i not "%%~xi" equ ".bat" (
- if %%~zi gtr %n% (
- echo %%~zi^|%%~nxi
- ) else (
- for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do echo %%a^|%%~nxi
- )
- )
- ))>"%temp%\back.txt"
- echo done
- "%temp%\back.txt"
- exit /b
-
- :huifu
- if not exist "%temp%\back.txt" (
- exit /b
- )
- for /r %%i in (*) do (
- if /i not "%%~xi" equ ".bat" (
- ren "%%i" "%%~nxi.$"
- )
- )
- for /r %%i in (*.$) do (
- if %%~zi gtr %n% (
- for /f "tokens=1* delims=|" %%f in ('find "%%~zi|" ^<"%temp%\back.txt"') do ren "%%i" "%%g"
- ) else (
- for /f "delims=" %%a in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do (
- for /f "tokens=1* delims=|" %%f in ('find "%%a|" ^<"%temp%\back.txt"') do ren "%%i" "%%g"
- )
- )
- )
- echo done
- exit /b
复制代码
恢复之后不会删除back.txt,备份一次,可以多次恢复。不考虑 ”大文件“ 大小相同,不考虑0字节文件。
作者: 77七 时间: 2023-9-8 22:38
站内搜一下,给鼠标右键菜单添加 打开cmd,直接在需要的目录下打开cmd窗口执行就行了。
作者: thp2008 时间: 2023-9-8 22:49
站内搜一下,给鼠标右键菜单添加 打开cmd,直接在需要的目录下打开cmd窗口执行就行了。
77七 发表于 2023-9-8 22:38
再次表示感谢!辛苦了!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |