在目录1.txt 2.txt 3.txt 3.txt .. n.txt中有一些文件,我需要使用md5总和将它们全部重命名。 累了
for %f in (*.txt) do certutil -hashfile "%f" MD5 | findstr /C:2
答案 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