2017-08-03 46 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