回显命令而不移至新行并继续批处理中的上一行

问题描述 投票:0回答:1

以下代码尝试将树中所有 .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
命令在将哈希值写入文本文件中的特定行后立即写入文件名,而不是先写入文件名,然后再写入哈希值?

如果我对问题的某些部分不清楚,请告诉我,谢谢。

batch-file cmd
1个回答
0
投票

可以用于此任务:

@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
命令行上用脱字符号 | 转义,以便被解释为文字字符,该命令使用单独的命令进程在后台启动,并使用 ^ 中的命令行作为附加参数附加。
    

© www.soinside.com 2019 - 2024. All rights reserved.