将Md5校验和放入文件名

时间:2018-08-11 10:41:16

标签: batch-file cmd

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

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

3 个答案:

答案 0 :(得分:1)

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

for %a in (*.txt) do @for /f "skip=1 tokens=1,* delims=:" %b in ('certutil -hashfile "%a" MD5') do @if "%c"=="" @echo ren "%a" "%b%~xa"

for /f使用skip子句来避免certutil的输出(文件名)的第一行,而冒号作为分隔符来分隔行以处理不需要的行输出消息(以CertUtil:开头)。

这样,如果该行包含一个冒号(不需要的行),它将被拆分为两个(tokens=1,*),将左侧令牌存储在%b中,将右侧令牌存储在{{1}中}。

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

注意:

  • %c命令仅回显到控制台。如果输出看起来正确,请删除ren命令。

  • 如果无法读取文件(锁定或为空),echo仅输出错误行,因此不会有任何哈希,并且所有行都将被丢弃,而不执行重命名操作。

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

certutil

已编辑,以将批处理中sst指出的更正内容包含在批处理代码中

答案 1 :(得分:0)

您可以尝试使用类似此批处理脚本的方法,只需将其另存为 Rename2MD5.bat ,然后将其放在存储文本文件的目录中,然后双击即可执行 如果一切正常,则可以在echo命令之前删除Ren命令。

@echo off
Color 0A 
Title Rename Files to MD5 Hashes
echo(
SetLocal EnableDelayedExpansion
for %%a in (*.txt) do (
     for /f "skip=1 delims=" %%H in ('CertUtil -hashfile "%%a" MD5 ^| findstr /i /v "CertUtil"') do ( set H=%%H)
        echo "%%a" = "!H!.txt"
        echo Ren "%%a" "!H!.txt"
)
EndLocal
Pause & Exit

答案 2 :(得分:0)

为了确保新重命名的.txt文件不会循环回到初始For循环中,并且因为MD5的结果可能是两个由空格分隔的字符串组成的集合,我可能会考虑使用批处理文件来进行以下操作:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

For /F "Delims==" %%A In ('Set _[ 2^>Nul') Do Set "%%A="

For /F "Tokens=1* Delims=]" %%A In ('Where .:*.txt 2^>Nul^|Find /N /V ""') Do (
    For /F "Delims=" %%C In ('CertUtil -HashFile "%%B" MD5 2^>Nul^|Find /V ":"'
    ) Do (Set "_=%%C" & Call Set "_%%A]=Ren "%%B" "%%_: =%%%%~xB""))

For /F "Tokens=1* Delims==" %%A In ('Set _[ 2^>Nul') Do %%B