标题: [文件操作] 批处理如何校验文件的crc32追加到文件名后面? [打印本页]
作者: wqte45 时间: 2024-2-19 10:56 标题: 批处理如何校验文件的crc32追加到文件名后面?
- D:\>crc32.exe xixi_0001.mp4
-
- CRC Verification Utility, Version 3.05
- Copyright (C) Microsoft, 1992-1997
-
- 100% complete
-
- CRC of file xixi_0001.mp4 (99738814 bytes) is 0xC27F18EA
复制代码
在网上找到一个crc32 如何写一个批处理集成到文件右键菜单里,并显示Hash && rename
点击后就把文件名修改成xixi_0001 0xC27F18EA.mp4
作者: wqte45 时间: 2024-2-19 12:55
刚才用AI帮忙写了一个例子,修改了下基本可以用了- @echo off
- set "file=%1"
- for /f "tokens=8" %%i in ('crc32 "%file%"') do (
- echo file : %file%
- echo crc32 : %%i
- set "newFileName=%~n1 %%i%~x1"
- )
- echo rename: %newFileName%
- ren "%file%" "%newFileName%"
复制代码
这样写有什么隐患吗? 还有更好的写法吗?
输出结果就这样:- D:\>"hash & rename.bat" D:\pm860.mp4
- 100% complete
-
- file : D:\pm860.mp4
- crc32 : 0x4E5DA11A
- 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)
右键管理员执行
- @echo off
- rem 批处理保存为ansi编码格式
- >"C:\Program Files\文件名添加crc32值.bat" echo @for /f "delims=" %%%%i in ('crc32 "%%~1"') do ren "%%~1" "%%~n1 %%%%i%%~x1"
- reg add "HKCR\*\shell\hash && rename\Command" /ve /t REG_SZ /d "\"C:\Program Files\文件名添加crc32值.bat\" \"%%1\"" /f
- 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又错了。- D:\>crc32.exe xixi_0001.mp4
-
- CRC Verification Utility, Version 3.05
- Copyright (C) Microsoft, 1992-1997
-
- 100% complete
-
- CRC of file xixi_0001.mp4 (99738814 bytes) is 0xC27F18EA
复制代码
这一行会变化,怎么样准确的获取最后一行的 is后面的 0x内容?
作者: aloha20200628 时间: 2024-2-19 15:35
回复 9# wqte45
如下代码说明》"%~1"即为用双引号包裹的目标文件名(可内含空格),变量crc即为0x之后的数值- for /f "delims=" %%i in (' crc32 "%~1" ') do (set "i=%%i")
- set "crc=%i:* bytes) is 0x=%"
- echo,%crc%
复制代码
作者: wqte45 时间: 2024-2-19 17:03
回复 3# Batcher - @echo off
- for /f "skip=3 tokens=*" %%i in ('crc32 "%~1"') do (
- set str=%%i
- echo file : %~1
- echo crc32 : %str:~-8%
- echo rename: %~n1 %str:~-8%%~x1"
- )
复制代码
我这个怎么不稳定呢? 有时候显示的crc32时错的(是上一次其他文件的crc32)
保留的有缓冲吗?- file : D:\Everything 0xCEA21FF1 CEA21FF1.ini
- crc32 : CEA21FF1
- rename: Everything 0xCEA21FF1 CEA21FF1 CEA21FF1.ini"
- D:\>"hash & rename.bat" "D:\Run History 2DED4E27 2DED4E27.csv"
- 100% complete
-
- file : D:\Run History 2DED4E27 2DED4E27.csv
- crc32 : CEA21FF1
- rename: Run History 2DED4E27 2DED4E27 CEA21FF1.csv"
- D:\>"hash & rename.bat" "D:\Run History 2DED4E27 2DED4E27.csv"
- 100% complete
-
- file : D:\Run History 2DED4E27 2DED4E27.csv
- crc32 : 2DED4E27
- rename: Run History 2DED4E27 2DED4E27 2DED4E27.csv"
复制代码
作者: wqte45 时间: 2024-2-19 18:04
回复 10# aloha20200628
最后还是借鉴了你的代码 你看看怎么样?- @echo off
- for /f "skip=3 delims=" %%i in ('crc32 "%~1"') do set str=%%i
- echo file : %~1
- echo crc32 : %str:~-8%
- echo rename: %~n1 %str:~-8%%~x1
- ren "%~1" "%~n1 %str:~-8%%~x1"
复制代码
我之前写的发现有问题,有时候成功 有时候下一次获取的crc32 时上一次运行的别的文件的crc
感觉像是缓存到下一次了
我之前的问题代码你也看看,我感觉是不是 写到循环体里面的原因,借鉴你的代码,我写到循环体外面就没问题,真奇怪- @echo off
- for /f "skip=3 tokens=*" %%i in ('crc32 "%~1"') do (
- set str=%%i
- echo file : %~1
- echo crc32 : %str:~-8%
- echo rename: %~n1 %str:~-8%%~x1
- )
复制代码
空文件都输出crc,在测试别的还是 多测试几次就更新了- D:\>"hash & rename.bat"
- file :
- crc32 : 2DED4E27
- rename: 2DED4E27
- file :
- crc32 : 2DED4E27
- rename: 2DED4E27
- D:\>"hash & rename.bat" "a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4"
- 100% complete
-
- file : a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
- crc32 : cified.
- rename: a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE cified..mp4
- D:\>"hash & rename.bat" "a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4"
- 100% complete
-
- file : a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
- crc32 : 756ED4BE
- rename: a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
- D:\>"hash & rename.bat" "a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4"
- 100% complete
-
- file : a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
- crc32 : 756ED4BE
- rename: a.txt 756ED4BE 756ED4BE 756ED4BE 756ED4BE 756ED4BE.mp4
- D:\>
复制代码
作者: aloha20200628 时间: 2024-2-19 19:24
本帖最后由 aloha20200628 于 2024-2-19 19:30 编辑
回复 12# wqte45
帮你订正的代码说明》
如命令行参数为空则批处理脚本直接退出;
采用setlocal确保外部变量与本脚本变量互不干扰;
若crc数值长度可能变化则建议仍用 %str:* bytes) is 0x=% 替代 %str:~-8%- @echo off & if "%~1"=="" (exit/b) else setlocal
- for /f "skip=3 delims=" %%i in (' crc32 "%~1" ') do set "str=%%i"
- echo,file: %~1
- echo,crc32: %str:~-8%
- echo,rename: %~n1 %str:~-8%%~x1
- ren "%~1" "%~n1 %str:~-8%%~x1"
- endlocal & exit/b
复制代码
作者: wqte45 时间: 2024-2-20 17:04
回复 13# aloha20200628
代码里for里面的明明对参数加双引号了 crc32 "%~1" 但是在cmd里拖进去文件的时候 特别文件名里有&符号的话。
理解成两条命令了 bat里参数都加双引号了 总不能用的时候还要手动再加一次吧?有啥好方法吗?- D:\Hash & Rename\2>crc32 C:\Users\MEN\Desktop\1&2.c
-
- CRC Verification Utility, Version 3.05
- Copyright (C) Microsoft, 1992-1997
-
-
- ERROR: Failed to open file C:\Users\MEN\Desktop\1
- (2) The system cannot find the file specified.
-
- '2.c' 不是内部或外部命令,也不是可运行的程序
- 或批处理文件。
复制代码
作者: aloha20200628 时间: 2024-2-20 18:06
回复 14# wqte45
这是一个古老的话题,查过中外有关老帖,至今无解,其实只要路径文件名中不含空格,不止&字符,还有一些所谓的特殊字符如()^等均会暴雷。绕行之路或是在路径文件名中加空格,或不用这些特殊字符。
作者: wqte45 时间: 2024-2-20 21:29
回复 15# aloha20200628
好的 谢谢回复,我新手刚遇到这个问题
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |