![MD5没有改变吗?](https://linux22.com/image/1407323/MD5%E6%B2%A1%E6%9C%89%E6%94%B9%E5%8F%98%E5%90%97%EF%BC%9F.png)
我有 3 个 rar 文件(均具有相同的 md5),并且我使用此代码来更改 Md5:
@echo off
setlocal enabledelayedexpansion
set /A Counter=0
FOR %%1 in (*.rar) do (
set /A Counter= !Counter! + 1
COPY %%1+!Counter!
echo !Counter!
)
pause
当我运行 .bat 文件时,它显示 3 行,值为:1、2、3,但当我检查 3 个 rar 文件的 md5 时,它们相同,尽管它们已更改。为什么?我做错了什么?谢谢!
答案1
最有可能的是,文件 '.\1'、'.\2' 和 '.\3' 不存在。复制命令copy archive.rar+1
将文件 '1' 的内容附加到 .rar 文件。如果文件不存在,则将其视为空文件。尽管如此,哈希值还是会发生变化,因为如果没有 '/b' 标志,该命令还会附加字符 0x1A。由于所有以 (*.rar) 开头的文件都是相同的,因此向每个文件添加相同的字节将导致三个完全相同的 .rar 文件,并且 MD5 完全相同。
您可以通过创建具有不同内容的文件“.\1”、“.\2”等来确保运行脚本后 MD5 值不同。如果您只是想附加字符,则可能需要使用类似的方法echo !Counter! >> %%1
。当然,生成的文件将不再是有效的 rar 档案。为此,您需要一个带有命令行界面的 rar 工具。
答案2
您的批处理脚本存在一些问题。您尝试执行的操作是将数字附加到原始文件的末尾,以更改其 MD5 哈希值。但是:
- 加号 (
+
) 只能用于合并多个现有文件。 您正在处理二进制文件,因此需要使用参数
/b
。/b
指示命令解释器读取目录中文件大小所指定的字节数。/b
是的默认值copy
,除非copy
合并文件。当
/b
它位于命令行上的文件列表之前或之后时,它将应用于所有列出的文件,直到复制遇到/a
。来源:复制
基本上,您需要将要附加的号码存储在临时文件中,然后将其与原始.rar
档案合并。这是一个修复的、可用的版本:
@echo off
setlocal
setlocal enabledelayedexpansion
set tempFile=%temp%\%random%%random%.tmp
set /a counter=0
for %%G in (*.rar) do (
set /a counter += 1
<nul set /p=!counter!>"%tempFile%"
copy /b "%%~G"+"%tempFile%" >nul
echo !counter!
)
del "%tempFile%" 2>nul
pause
endlocal & exit /b
笔记如果要递归扫描文件夹,请替换for
为。for /r