Batch file 批处理-将特定命令行输出作为变量写入,而不使用临时文件?

Batch file 批处理-将特定命令行输出作为变量写入,而不使用临时文件?,batch-file,cmd,certutil,findstr,Batch File,Cmd,Certutil,Findstr,certutil hash.cmd的代码: 我想用散列值将整个第二行保存在一个变量中。CMD输出: MD5 hash from C:\Users\ZerTerO\Desktop\certutil-hash.cmd: 9913d66d0b741494962e94ff540a8147 CertUtil: -hashfile command executed successfully. 在我看来,唯一的解决方案是: @echo off cls call:hashfile set "md5=

certutil hash.cmd的代码:

我想用散列值将整个第二行保存在一个变量中。CMD输出:

MD5 hash from C:\Users\ZerTerO\Desktop\certutil-hash.cmd:
9913d66d0b741494962e94ff540a8147
CertUtil: -hashfile command executed successfully.
在我看来,唯一的解决方案是:

@echo off
cls
call:hashfile
set "md5=%md5: =%"
echo.%md5%
pause>nul
exit

:hashfile
for /f "skip=1 tokens=1 delims=" %%a in ('certutil -hashfile "%~dpnx0" md5') do (set "md5=%%a" & goto:eof)
有更优雅的解决方案吗

我只需要这样做,因为Windows 7和Windows 8在值之间写入空格:

set "md5=%md5: =%"
先谢谢你


ZerTerO

对于使用
HashAlgorithm
参数的
CertUtil
版本(请参见我的评论),您可以更好地处理循环,如下所示:

Set“md5=”
对于('CertUtil-HashFile“%~f0”MD5^ | FindStr/VRC:[^a-F 0-9]”中的/F Delims^=%%G,请设置“MD5=%%G”
或者更有力地像这样:

Set“md5=”
对于(“^”“%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
用于排除包含非字母字符的任何行
a
b
c
d
e
f
;数字字符
0
1
2
3
4
5
6
7
8
9
;在我看来,一个空格字符比跳过第一行然后在第二行处理后跳出循环更优雅

至于结果变量,我不确定在这种情况下,我是否会使用
set“md5=%md5:=%”来专门删除可能的空格,我只会使用
echo.%md5:=%
。但是,如果我在剩下的脚本中足够频繁地使用结果变量,我会在标记的部分中执行该任务:

@Echo关闭
setLocalEnableExtensions
ClS
设置“algo=MD5”
调用:HashFile“%~f0”%algo%
回音(%hash%)
暂停1>NUL
后藤:EOF
:HashFile
设置“哈希=”
对于/F Delims^=%%G In(“^”“%\uuuuuu APPDIR\uuuuuu%certutil.exe”-HashFile%1%2^>NUL^
^|“%\uuuu APPDIR\uuu%findstr.exe”/V/R/C:[^a-f 0-9]”^“)是否设置“哈希=%%G”
如果不是“%hash:=%”,则设置“hash=%hash:=%”
退出/B

5
理想情况下应该是例程的一部分,该例程确定操作系统上的版本是否支持两个参数。如果不支持,则该行将读取
Set“algo=”
。您还将注意到,我已将您的硬编码文件名移出循环,并将其用作
调用
命令的第一个输入参数。这将使您的脚本更加模块化,并且更加优雅。我还认为,在要求将其替换为空之前,检查
%hash%
是否包含空格更为优雅ing.优雅和效率不一定相同。

最新版本的Windows 10的输出中,对之间没有空格。但是,值得一提的是,
certutil
命令在不同的Windows版本中肯定不同。例如,在Windows Vista中,它不接受
HashAlgorithm
>参数,只有一个
infle
,它将仅作为
SHA1
返回。因此,为了使用该命令,您最好确定Windows的版本,以便更好地预测其输出。在Windows 7和Windows 8中,certutil仅支持md5。我今天对其进行了测试。@ZerTerO-还记得哈希需要大写吗?Tak看看戴夫·本汉姆的。
set "md5=%md5: =%"