Board logo

标题: [文件操作] 批处理如何校验文件的crc32追加到文件名后面? [打印本页]

作者: wqte45    时间: 2024-2-19 10:56     标题: 批处理如何校验文件的crc32追加到文件名后面?

  1. D:\>crc32.exe xixi_0001.mp4
  2. CRC Verification Utility, Version 3.05
  3. Copyright (C) Microsoft, 1992-1997
  4. 100% complete
  5. CRC of file xixi_0001.mp4 (99738814 bytes) is 0xC27F18EA
复制代码
在网上找到一个crc32 如何写一个批处理集成到文件右键菜单里,并显示Hash && rename
点击后就把文件名修改成xixi_0001 0xC27F18EA.mp4
作者: wqte45    时间: 2024-2-19 12:55

刚才用AI帮忙写了一个例子,修改了下基本可以用了
  1. @echo off
  2. set "file=%1"
  3. for /f "tokens=8" %%i in ('crc32 "%file%"') do (
  4.     echo file  : %file%
  5.     echo crc32 : %%i
  6.     set "newFileName=%~n1 %%i%~x1"
  7. )
  8. echo rename: %newFileName%
  9. ren "%file%" "%newFileName%"
复制代码
这样写有什么隐患吗? 还有更好的写法吗?

输出结果就这样:
  1. D:\>"hash & rename.bat" D:\pm860.mp4
  2. 100% complete
  3. file  : D:\pm860.mp4
  4. crc32 : 0x4E5DA11A
  5. rename: pm860 0x4E5DA11A.mp4
复制代码

作者: Batcher    时间: 2024-2-19 13:09

回复 2# wqte45


试过文件名带空格的情况吗?例如:
pm 860.mp4
作者: 77七    时间: 2024-2-19 13:23

以下代码使用从本站下载的crc32  (http://bcn.bathome.net/s/tool/index.html?key=crc32)
右键管理员执行
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. >"C:\Program Files\文件名添加crc32值.bat" echo @for /f "delims=" %%%%i in ('crc32 "%%~1"') do ren "%%~1" "%%~n1 %%%%i%%~x1"
  4. reg add "HKCR\*\shell\hash && rename\Command" /ve /t REG_SZ /d "\"C:\Program Files\文件名添加crc32值.bat\" \"%%1\"" /f
  5. pause
复制代码

作者: wqte45    时间: 2024-2-19 13:29

回复 3# Batcher
是的,你一眼看出空格问题了,厉害!

请问该怎么修改?
作者: Batcher    时间: 2024-2-19 13:52

回复 5# wqte45


2楼第2行改成这样试试:
set "file=%~1"
作者: Batcher    时间: 2024-2-19 13:55

回复 1# wqte45


也可以考虑在BAT里面调用系统自带的PowerShell来获取CRC32
这样的好处是不必依赖第三方crc32.exe
https://mp.weixin.qq.com/s/THQYfPGn03CViCEl6-Zzyg
作者: wqte45    时间: 2024-2-19 14:05

回复 4# 77七
你这个更简洁

还不知道论坛上有crc32呢 找了一大圈,你提供的crc32 输出结果只有单纯的crc32值,
那么 “delims=” 不用要就可以了吧。
作者: wqte45    时间: 2024-2-19 14:39

回复  wqte45


2楼第2行改成这样试试:
set "file=%~1"
Batcher 发表于 2024-2-19 13:52


改完之后,获取的crc32又错了。
  1. D:\>crc32.exe xixi_0001.mp4
  2. CRC Verification Utility, Version 3.05
  3. Copyright (C) Microsoft, 1992-1997
  4. 100% complete
  5. CRC of file xixi_0001.mp4 (99738814 bytes) is 0xC27F18EA
复制代码
这一行会变化,怎么样准确的获取最后一行的 is后面的 0x内容?
作者: aloha20200628    时间: 2024-2-19 15:35

回复 9# wqte45

如下代码说明》"%~1"即为用双引号包裹的目标文件名(可内含空格),变量crc即为0x之后的数值
  1. for /f "delims=" %%i in (' crc32 "%~1" ') do (set "i=%%i")
  2. set "crc=%i:* bytes) is 0x=%"
  3. echo,%crc%
复制代码

作者: wqte45    时间: 2024-2-19 17:03

回复 3# Batcher
  1. @echo off
  2. for /f "skip=3 tokens=*" %%i in ('crc32 "%~1"') do (
  3.     set str=%%i
  4.     echo file  : %~1
  5.     echo crc32 : %str:~-8%
  6.     echo rename: %~n1 %str:~-8%%~x1"
  7. )
复制代码
我这个怎么不稳定呢? 有时候显示的crc32时错的(是上一次其他文件的crc32)
保留的有缓冲吗?
  1. file  : D:\Everything 0xCEA21FF1 CEA21FF1.ini
  2. crc32 : CEA21FF1
  3. rename: Everything 0xCEA21FF1 CEA21FF1 CEA21FF1.ini"
  4. D:\>"hash & rename.bat" "D:\Run History 2DED4E27 2DED4E27.csv"
  5. 100% complete
  6. file  : D:\Run History 2DED4E27 2DED4E27.csv
  7. crc32 : CEA21FF1
  8. rename: Run History 2DED4E27 2DED4E27 CEA21FF1.csv"
  9. D:\>"hash & rename.bat" "D:\Run History 2DED4E27 2DED4E27.csv"
  10. 100% complete
  11. file  : D:\Run History 2DED4E27 2DED4E27.csv
  12. crc32 : 2DED4E27
  13. rename: Run History 2DED4E27 2DED4E27 2DED4E27.csv"
复制代码

作者: wqte45    时间: 2024-2-19 18:04

回复 10# aloha20200628


    最后还是借鉴了你的代码 你看看怎么样?
  1. @echo off
  2. for /f "skip=3 delims=" %%i in ('crc32 "%~1"') do set str=%%i
  3. echo file  : %~1
  4. echo crc32 : %str:~-8%
  5. echo rename: %~n1 %str:~-8%%~x1
  6. ren "%~1" "%~n1 %str:~-8%%~x1"
复制代码
我之前写的发现有问题,有时候成功 有时候下一次获取的crc32 时上一次运行的别的文件的crc
感觉像是缓存到下一次了
我之前的问题代码你也看看,我感觉是不是 写到循环体里面的原因,借鉴你的代码,我写到循环体外面就没问题,真奇怪
  1. @echo off
  2. for /f "skip=3 tokens=*" %%i in ('crc32 "%~1"') do (
  3.     set str=%%i
  4.     echo file  : %~1
  5.     echo crc32 : %str:~-8%
  6.     echo rename: %~n1 %str:~-8%%~x1
  7. )
复制代码
空文件都输出crc,在测试别的还是 多测试几次就更新了
  1. D:\>"hash & rename.bat"
  2. file  :
  3. crc32 : 2DED4E27
  4. rename:  2DED4E27
  5. file  :
  6. crc32 : 2DED4E27
  7. rename:  2DED4E27
  8. D:\>"hash & rename.bat" "a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4"
  9. 100% complete
  10. file  : a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
  11. crc32 : cified.
  12. rename: a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE cified..mp4
  13. D:\>"hash & rename.bat" "a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4"
  14. 100% complete
  15. file  : a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
  16. crc32 : 756ED4BE
  17. rename: a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
  18. D:\>"hash & rename.bat" "a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4"
  19. 100% complete
  20. file  : a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
  21. crc32 : 756ED4BE
  22. rename: a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
  23. D:\>
复制代码

作者: aloha20200628    时间: 2024-2-19 19:24

本帖最后由 aloha20200628 于 2024-2-19 19:30 编辑

回复 12# wqte45

帮你订正的代码说明》
如命令行参数为空则批处理脚本直接退出;
采用setlocal确保外部变量与本脚本变量互不干扰;
若crc数值长度可能变化则建议仍用 %str:* bytes) is 0x=% 替代 %str:~-8%
  1. @echo off & if "%~1"=="" (exit/b) else setlocal
  2. for /f "skip=3 delims=" %%i in (' crc32 "%~1" ') do set "str=%%i"
  3. echo,file: %~1
  4. echo,crc32: %str:~-8%
  5. echo,rename: %~n1 %str:~-8%%~x1
  6. ren "%~1" "%~n1 %str:~-8%%~x1"
  7. endlocal & exit/b
复制代码

作者: wqte45    时间: 2024-2-20 17:04

回复 13# aloha20200628
代码里for里面的明明对参数加双引号了 crc32 "%~1"  但是在cmd里拖进去文件的时候 特别文件名里有&符号的话。
理解成两条命令了  bat里参数都加双引号了   总不能用的时候还要手动再加一次吧?有啥好方法吗?
  1. D:\Hash & Rename\2>crc32 C:\Users\MEN\Desktop\1&2.c
  2. CRC Verification Utility, Version 3.05
  3. Copyright (C) Microsoft, 1992-1997
  4. ERROR: Failed to open file C:\Users\MEN\Desktop\1
  5. (2) The system cannot find the file specified.
  6. '2.c' 不是内部或外部命令,也不是可运行的程序
  7. 或批处理文件。
复制代码

作者: aloha20200628    时间: 2024-2-20 18:06

回复 14# wqte45

这是一个古老的话题,查过中外有关老帖,至今无解,其实只要路径文件名中不含空格,不止&字符,还有一些所谓的特殊字符如()^等均会暴雷。绕行之路或是在路径文件名中加空格,或不用这些特殊字符。

作者: wqte45    时间: 2024-2-20 21:29

回复 15# aloha20200628


    好的 谢谢回复,我新手刚遇到这个问题




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