gpt4 book ai didi

batch-file - 在 BATCH 中使用 HASH SHA1 比较两个文件夹中的文件

转载 作者:行者123 更新时间:2023-12-03 11:22:46 36 4
gpt4 key购买 nike

我有这个批处理代码,但它是错误的,我需要在屏幕上看到 folder2 中不在 folder1 中的文件的名称,将它们与您的 HASH SHA1 进行比较。临时文件位于同一目录中。感谢您的评论

@echo off
cd folder1
FOR /F "Delims=" %%A in ('DIR /B/A-D *.*') DO (
certUtil -hashfile "%%A" SHA1 | findstr /VI "HASH"| findstr /VI "certutil"
) >>folder2\output.tmp

cd folder2
FOR /F "Delims=" %%B in ('DIR /B/A-D *.* ^|Findstr /VEIL ".tmp"') DO (
certUtil -hashfile "%%B" SHA1 | findstr /VI "HASH"| findstr /VI "certutil" >>output2.tmp
FOR /F "Delims=" %%C in ('TYPE output2.tmp^|findstr /XLIV /G:output.tmp') DO (echo "%%B")
)

最佳答案

这是另一种不使用临时文件的解决方案。相反,它创建了一种关联数组,如 f|filename.ext=hash。所有的散列都存储为变量,并且可以使用 set "f|" 枚举一系列变量。基本上,这使得很容易获得与目录 1 中的文件名相关的哈希列表,然后使用此列表来比较目录 2。如果预期变量未定义,则目录 2 中的文件在目录 1 中不存在。如果它被定义,然后比较散列并取消定义。无论最后留下什么定义,都表示目录 1 中存在文件,但目录 2 中不存在该文件。

@echo off & setlocal

if "%~2"=="" goto usage

pushd "%~1" || goto usage
for /f "delims=" %%I in ('dir /b /a:-d') do (
for /f %%x in ('certutil -hashfile "%%~I" ^| find /v ":"') do set "f|%%~nxI=%%~x"
)
popd

pushd "%~2" || goto usage
for /f "delims=" %%I in ('dir /b /a:-d') do (
if not defined f^|%%~nxI (
echo %%~nxI does not exist in %~nx1\
) else (
for /f %%x in ('certutil -hashfile "%%~I" ^| find /v ":"') do (
setlocal enabledelayedexpansion
if not "%%~x"=="!f|%%~nxI!" (
echo %%~nxI hash mismatch
)
endlocal
set "f|%%~nxI="
)
)
)

for /f "tokens=2 delims=|=" %%I in ('cmd /c set "f|" 2^>NUL') do (
echo %%I does not exist in %~nx2\
)

goto :EOF

:usage
echo Usage: %~nx0 dir1 dir2
echo compares files in dir1 with those in dir2.

关于batch-file - 在 BATCH 中使用 HASH SHA1 比较两个文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45494397/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com