Windows批处理文件 - 将CertUtil输出、文件名和大小格式化为一行

3

我的要求是创建一个以下格式的输出文件:文件名,文件大小,校验和

例如:abc.tar,1024字节,052107adc8c42d6cf581bf81225ae6de

代码

setlocal enabledelayedexpansion  
set OUTFILE="C:\Script\Batch_OUT.txt"

echo %OUTFILE%

echo Extracting Batch records to %OUTFILE% ...
echo pwd = `pwd`

cd C:\Script\TARS\

for %%f in (Batch_*.tar) do (  
(echo %%~nxf && echo %%~zf Bytes && certutil -hashfile "%%f" MD5 | find /V    ":") >>%OUTFILE%  
) 

pause 2m

输出

Batch_one.tar 
778240 Bytes 
052107adc8c42d6cf581bf81225ae6de

预期结果

Batch_one.tar,778240 Bytes,052107adc8c42d6cf581bf81225ae6de

不,@DavidWinder,我还想为文件生成校验和。 - BPrasad
是的。虽然存在其他问题,但解决方案相同(不使用“CRLF”进行编写)。我在下面的答案中为您转换了问题。 - Stephan
1个回答

2
您可以使用与David Winder在评论中已经链接的帖子中相同的技巧:
...
for %%f in (test.txt) do (  
 (
   <nul set /p ".= %%~nxf,%%~zf Bytes," 
   certutil -hashfile "%%f" MD5 | find /V ":"
 ) >>%OUTFILE%  
) 
...

感谢@Stephan和David...那个片段很有用...我一直在将set /p分配给一个变量,并且在!<variable-name>!周围遇到了问题...但是上面的代码帮助我完成了任务...谢谢。 - BPrasad
在 certutil 命令行后添加 <nul set /p "=%%~dpnxA" & echo: 会在 MD5 值后生成不必要的换行符。但是,在 certutil 命令行中似乎无法使用 nul set /p 技巧:当我尝试在该命令行中使用它时,会出现语法错误。 - Ray Woodcock
1
@aRayWoodcock。a)你知道,“& echo:”会产生一个换行符吗?(<nul set /p "=%%~dpnxA" & echo:echo %%~dpnxAecho %%~fA具有完全相同的效果)b)“set / p”技巧适用于字符串,而不是命令。如果您需要其输出而没有换行符,请使用“for / f”循环捕获命令的输出:“for / f %% a in('certutil -hashfile“%%f”MD5 ^ | find / V“:”')do <nul set / p“= %% a”` - Stephan
1
你有一个简单的(复制和粘贴?)错误:你没有%%f。请用%%A替换它。此外,你不需要set /p技巧,因为所有所需信息同时存在:for %%A in (*) do (for /f %%B in ('certutil -hashfile "%%A" SHA512 ^| find /V ":"') do echo %%~tA %%~zA %%B %%~fA) - Stephan
1
没错。如果要使用 set /p 写入 certutil 的输出而不换行,您需要使用 for /f 循环来捕获输出。那么,为什么不直接使用捕获的字符串,而不是将其设置为变量以便使用笨拙的解决方法呢? - Stephan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接