Batch file 将Md5校验和放入文件名

Batch file 将Md5校验和放入文件名,batch-file,cmd,Batch File,Cmd,目录1.txt 2.txt 3.txt中有一些文件。。n、 txt,我需要用它们的md5总和重命名它们。 我累了 for %f in (*.txt) do certutil -hashfile "%f" MD5 | findstr /C:2 您可以尝试类似此批处理脚本的操作,只需将其另存为重命名MD5.bat,并将其放在存储文本文件的同一目录中,然后双击执行即可 如果一切正常,您可以在Ren命令之前删除echo命令 @echo关闭 颜色0A 标题将文件重命名为MD5哈希 回音( SetLoca

目录1.txt 2.txt 3.txt中有一些文件。。n、 txt,我需要用它们的md5总和重命名它们。 我累了

for %f in (*.txt) do certutil -hashfile "%f" MD5 | findstr /C:2

您可以尝试类似此批处理脚本的操作,只需将其另存为重命名MD5.bat,并将其放在存储文本文件的同一目录中,然后双击执行即可 如果一切正常,您可以在
Ren
命令之前删除
echo
命令

@echo关闭
颜色0A
标题将文件重命名为MD5哈希
回音(
SetLocal EnableDelayedExpansion
对于(*.txt)中的%%a,请执行以下操作(
对于/f“skip=1 delims=“%%H in('CertUtil-hashfile“%%a”MD5^ | findstr/i/v“CertUtil””)do(设置H=%%H)
回显“%%a”=“!H!.txt”
echo Ren“%%a”“!H!.txt”
)
端部
暂停和退出

如果您确实需要从命令行(根据您问题中的语法)执行此操作,您只需要为/f添加一个
,以处理为每个文件执行的
certutil
命令的输出

对于(*.txt)do@for/f“skip=1 tokens=1,*delims=:%b in('certutil-hashfile“%a”MD5')中的%a,如果“%c”=”@echo ren“%a”%b%~xa,则执行
/f
for
使用
skip
子句来避免
certutil
输出中的第一行(文件名)和冒号作为分隔符来拆分行以处理不需要的输出消息(以
certutil:
开头)

这样,如果该行包含冒号(不需要的行),它将被拆分为两个(
tokens=1,*
),将左标记存储在
%b
中,将右标记存储在
%c

如果
%c
有任何内容,则这不是包含哈希的行。如果
%c
为空,则这是包含哈希的行,我们将重命名该文件

注:

  • ren
    命令仅回显到控制台。如果输出似乎正确,请删除
    echo
    命令

  • 如果文件无法读取(锁定或为空),
    certutil
    只输出错误行,因此不会有任何散列,如果不执行重命名操作,所有行都将被丢弃

无论如何,从命令行执行此操作很容易出错。如果可以,正如Hackoo建议的那样,使用批处理文件

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于/f“tokens=1,*delims=:”%%a in('
用于(*.txt)中%%f的cmd/q/c“do certutil-hashfile”%%f“MD5&(回显文件:%%f)”
^|findstr/v/b/i/c:“MD5”/c:“证书”
""做"(
如果“%%a”==“文件”(
设置“文件=%%b”
设置“扩展=%%~xb”
延迟扩展
echo ren“!file!”!md5:=!!扩展名!”
端部
设置“md5=”
)否则(
设置“md5=%%a”
)
)

<强>编辑< <强> >在批次代码中,在注释< /p> 中指出SST所指的纠正,以确保我新更名的<>代码.txt < /c>文件不被循环回<<代码> > 循环,并且因为MD5的结果可能是一组由空格分隔的两个字符串,所以我可能会考虑使用批处理文件执行类似操作:

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
对于/F“Delims=”('Set[2^>Nul')中的%%A,请设置“%%A=”
对于/F“Tokens=1*Delims=]”中的%%A('Where.*.txt 2^>num^| Find/N/V“”)Do(
对于/F“Delims=“%%C In('CertUtil-HashFile“%%B”MD5 2^>Nul^|Find/V):“'
)Do(设置“\=%%C”&调用设置“\%%A]=Ren”%%B”“%%\\=%%%xB”“)
对于/F“Tokens=1*Delims==”%%A In('Set[2^>Nul')Do%%B

批处理运行后,脚本已更改名称,但丢失了文件扩展名。如“e2cfe4cd8e52eed3e602b6730df29d4e”。无文件extension@AligamarliNamazov你至少测试过我的批次了吗?@AligamarliNamazov,答案更新。你只需要将
ren“%a”%b
更改为
ren“%a”%b%~xa
(要防止文件扩展名被
%a
)引用,或者如果只处理
.txt
文件,则只需使用
ren“%a”%b.txt
@MCND,在某些windows版本上,哈希算法必须以大写形式传递,否则cerutil将失败,这在我的windows 7上是肯定的,在我的windows 10上certutil接受小写、大写和混合大写。我找不到Microsoft关于此行为的任何官方声明。此外,从哈希字符串中删除空格似乎也是错误的好主意,同样是因为Windows版本之间的输出格式不同。例如,
e2 cf e4 cd…
vs
e2cfe4cd…
@sst,谢谢,你是对的。内存不好,手头只有Windows 10,这样结束了。