2017-08-03 105 views
2

我有这个批处理代码,但它是错误的,我需要的是在屏幕上看到folder1中不在folder1中的文件的名称,并将它们与您的HASH SHA1进行比较。临时文件位于相同的目录中。 我感谢您的意见在BATCH中使用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") 
) 
+1

如果我们的意见会发生什么事,你会回复正或忽略他们作为你的最后一个问题? – Compo

回答

2

下面是一个使用任何临时文件另一种解决方案。相反,它会创建一个像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. 
+0

谢谢,它帮了我很多!! – Danielle

+0

我有一个问题用你发送的代码,我希望你能帮助我 当我使用带有散列**“f | %%〜nxI = %%〜x”的文件名变量时**只保存最后一个文件的散列我不能比较 – Danielle

+0

@Danielle看起来你正在比较变量名和哈希值是不是应该是'“!f | %%〜nxI!== %%〜x”'?或者也许我需要更多的上下文来理解这个问题 – rojo

3
  • 的certutil哈希没有冒号其他行做。
  • 只有哈希文件不无相应的文件
  • 以下批处理创建两个文件夹
  • 另外从文件夹2每个哈希在文件夹1如果存在检查哈希文件名对意义的 - 如果不是它是呼应到屏幕上。

@echo off 
Set Dir1=A:\ 
Set Dir2=Q:\Test\2017\08\03\ 

PushD "%Dir1%" 
(FOR /F "Delims=" %%A in ('DIR /B/A-D *.*' 
) DO For /f "delims=" %%B in (
'certUtil -hashfile "%%A" SHA1 ^| findstr /V ":"' 
) Do Echo %%B %%~fA 
)> "%Dir2%\output1.tmp" 
PopD 

PushD "%Dir2%" 
Type Nul >output2.tmp 
FOR /F "Delims=" %%A in ('DIR /B/A-D *.* ^|Findstr /LIVE ".tmp"' 
) DO For /f "delims=" %%B in ('certUtil -hashfile "%%A" SHA1 ^| findstr /V ":"') Do (
     >> output2.tmp Echo %%B %%~fA 
     Findstr "%%B" output1.tmp >Nul 2>&1 || Echo Hash %%B not in "%Dir1%" File %%~fA 
    ) 
) 
PopD 

采样运行:

> Q:\Test\2017\08\03\SO_45494397.cmd 
Hash fcfd29ab1ba8b64411d5ce461a35f07907862533 not in "A:\" File Q:\Test\2017\08\03\Get-EpubMetaInfo.ps1 
Hash aa37d47dc96380532c88559045b6c3fa080e2556 not in "A:\" File Q:\Test\2017\08\03\Get-MSebooks.ps1 
Hash ae29aeca5a433993ec854ddea6d8469516d2293c not in "A:\" File Q:\Test\2017\08\03\Handle-ZipFile.psm1 
Hash 2d0d7fc7927f007b8aba4032d1c9fe86074ec8a1 not in "A:\" File Q:\Test\2017\08\03\SO_45494397.cmd 

样品output_.tmp

> Type output1.tmp 
c10937240668c7c09dbac247b5cb0e30f027cfe6 A:\SO_45490060.cmd 
47c005b12889d32107b53bdbd16e94f029d330c4 A:\SO_45491838.cmd 
af6cccbeec7b80cbb37143316bd910bf6dcf622e A:\SO_45494397.cmd 

> Type output2.tmp 
fcfd29ab1ba8b64411d5ce461a35f07907862533 Q:\Test\2017\08\03\Get-EpubMetaInfo.ps1 
aa37d47dc96380532c88559045b6c3fa080e2556 Q:\Test\2017\08\03\Get-MSebooks.ps1 
ae29aeca5a433993ec854ddea6d8469516d2293c Q:\Test\2017\08\03\Handle-ZipFile.psm1 
c10937240668c7c09dbac247b5cb0e30f027cfe6 Q:\Test\2017\08\03\SO_45490060.cmd 
47c005b12889d32107b53bdbd16e94f029d330c4 Q:\Test\2017\08\03\SO_45491838.cmd 
52b8e933411859e450fde3e8735658d9f52159b0 Q:\Test\2017\08\03\SO_45494397.cmd 
+0

所有文件都不同,我看不到任何文件。对不起,我是新的批次:( – Danielle

+1

'findstr/v“的好主意:'''certutil'的输出。+1。 – rojo