以下代码尝试将树中所有 .rgsp 文件的哈希值写入文本文件:
for /r %%A in (*.rsgp) do (
echo | set /p="%%A * "
certutil -hashfile %%A MD5 | find /v "h"
) >> file.txt
文本文件中的输出结果将如下所示:
filename * hash
但是,我想做的是以不同的顺序输出它:
hash * filename
我确实尝试将
echo|set /p="%%A * "
放在 certutil
命令之后,但这仍然不起作用,因为 echo
出于某种原因仍会在哈希之前写入文件名,但它会忽略文本文件中的第一行,如下所示:
hash
filename * hash
filename * hash
...
如何使
echo
命令在将哈希值写入文本文件中的特定行后立即写入文件名,而不是先写入文件名,然后再写入哈希值?
如果我对问题的某些部分不清楚,请告诉我,谢谢。
可以用于此任务:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
(for /R %%I in (*.rsgp) do for /F "delims=" %%J in ('%SystemRoot%\System32\certutil.exe -hashfile "%%I" MD5 ^| %SystemRoot%\System32\find.exe /V "h"') do echo %%J * %%I)>"files.txt"
endlocal
由于使用了
FOR选项,文件名以完全限定的文件名写入输出文件
files.txt
导致在 current目录(不一定是批处理文件目录)中递归搜索,并且其所有非隐藏文件的子目录都与长或短文件名中的通配符模式
/R
匹配,并将具有完整路径的文件名分配给循环变量 *.rsgp
。可以在命令行末尾使用选项 I
代替 %%~nxI
,仅将文件名 + 文件扩展名写入输出文件 %%I
。 FOR将仅分配带有文件扩展名的文件名,而没有循环变量的完整路径
files.txt
省略 FOR选项
I
仅在当前目录中搜索非隐藏 /R
文件。上述变体将 MD5 哈希值写入输出文件,哈希值每个字节的十六进制值之间没有空格。
.rsgp
要了解所使用的命令及其工作原理,请打开命令提示符
窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
(for /R %%# in (*.rsgp) do for /F "tokens=1-16" %%G in ('%SystemRoot%\System32\certutil.exe -hashfile "%%#" MD5 ^| %SystemRoot%\System32\find.exe /V "h"') do echo %%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V * %%#)>"files.txt"
endlocal
certutil -?
certutil -hashfile -?
echo /?
endlocal /?
find /?
for /?
的 Microsoft 文档,了解 setlocal /?
的说明。当 Windows 命令解释器在执行命令
FOR之前处理此命令行时,重定向运算符
|
必须在 FOR命令行上用脱字符号
|
转义,以便被解释为文字字符,该命令使用单独的命令进程在后台启动,并使用 ^
中的命令行作为附加参数附加。