首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理-将特定的命令行输出写成没有临时文件的变量?

批处理-将特定的命令行输出写成没有临时文件的变量?
EN

Stack Overflow用户
提问于 2020-07-23 16:06:59
回答 1查看 657关注 0票数 1

certutil-hash.cmd代码

代码语言:javascript
复制
@echo off
certutil -hashfile "%~dpnx0" md5
pause>nul

我想用变量中的哈希值保存整个第二行。CMD-产出:

代码语言:javascript
复制
MD5 hash from C:\Users\ZerTerO\Desktop\certutil-hash.cmd:
9913d66d0b741494962e94ff540a8147
CertUtil: -hashfile command executed successfully.

在我看来,唯一的解决方案是这样的:

代码语言:javascript
复制
@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在值之间写入空格:

代码语言:javascript
复制
set "md5=%md5: =%"

提前谢谢..。

ZerTerO

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-23 18:33:47

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

代码语言:javascript
复制
Set "md5="
For /F Delims^= %%G In ('CertUtil -HashFile "%~f0" MD5^|FindStr /VRC:"[^a-f 0-9]"')Do Set "md5=%%G"

或者像这样更坚强:

代码语言:javascript
复制
Set "md5="
For /F Delims^= %%G In ('^""%__APPDIR__%certutil.exe" -HashFile "%~f0" MD5^|"%__APPDIR__%findstr.exe" /VRC:"[^a-f 0-9]"^"')Do @Set "md5=%%G"

使用findstr排除任何包含非字母字符abcdef的字符的行;数字字符0123456789;或空格字符,在我看来,比跳过第一行,然后在第二行处理后脱离循环更优雅。

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

代码语言:javascript
复制
@Echo Off
SetLocal EnableExtensions
ClS

Set "algo=MD5"

Call :HashFile "%~f0" %algo%

Echo(%hash%

Pause 1> NUL
GoTo :EOF

:HashFile
Set "hash="
For /F Delims^= %%G In ('^""%__APPDIR__%certutil.exe" -HashFile %1 %2 2^> NUL ^
 ^| "%__APPDIR__%findstr.exe" /V /R /C:"[^a-f 0-9]"^"') Do Set "hash=%%G"
If Not "%hash: =%" == "%hash%" Set "hash=%hash: =%"
Exit /B

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63058550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档