certutil -hashfile输出以文件和错误处理



我需要从同一批处理文件中生成的文件列表中生成带有hashfile标签的文件。这是我到目前为止的代码:

@echo off
setlocal enabledelayedexpansion
:: Set the variables for this script.
set testfolder=c:testtest folder
set listfile=c:testoutputfile list.txt
set hashfile=c:testoutputhashes.txt
:: Delete any of the files that were created the last time this script was ran.
del "%hashfile%"
del "%listfile%"
cls
:: Generate a file with a list of all of the files (with path) in designated folder and subdirectories.
:: Directory and subdirectory names are not included in the list. Only files.
dir /s /b /a-d "%testfolder%" > "%listfile%"
:: Assign each line of the file above to its own variable.
set counter=1
for /f "usebackq delims=" %%x in ("%listfile%") do (
  set "line_!counter!=%%x"
  set /a counter+=1
)
:: Count the number of lines in the above file to use as a reference point.
set /a numlines=counter - 1
:: Generate an MD5 hash for each variable and write it to a file with a blank space between each.
for /l %%x in (1,1,%numlines%) do (
  certutil -hashfile "!line_%%x!" MD5 >> "%hashfile%"
  echo( >> "%hashfile%"
)
eof

对于我生成的大多数文件的文件,我得到了类似的东西:

MD5 hash of file c:testtest folderCitrix 2.bmp:
31 34 d6 04 cd b0 4b ef a7 63 c3 e9 ae a8 3d 01
CertUtil: -hashfile command completed successfully.

但是有时我会遇到一个错误:

CertUtil: -hashfile command FAILED: 0x800703ee (WIN32: 1006)
CertUtil: The volume for a file has been externally altered so that the opened file is no longer valid.
  1. 为什么有些文件会给出此错误?
  2. 我如何删除以 certutil的开头的任何行:,因此我没有不必要的行,或者有没有办法将certutil命令的前2行写入文件。<<<<<<<<<<<<<</li>
  3. %hashfile%处于最终形式之后,我想运行certutil -hashfile "%hashfile% MD5并将哈希码分配给变量。这是什么语法?

略微修改的代码段显示0x800703ee (WIN32: 1006 ERROR_FILE_INVALID)错误消息仅适用于零长度文件(参见rem注释)。

:: Generate an MD5 hash for each variable and write it to a file with a blank line...
>"%hashfile%" (
  for /l %%x in (1,1,%numlines%) do (
        rem debugging: show file length for each file
    for %%G in ("!line_%%x!") do echo(%%~zG "%%~G"
        rem operational: skip certutil for zero length files (requires elaboration)   
    certutil -hashfile "!line_%%x!" MD5
    echo(
  )
)

请参阅%%~zG"%%~G"说明的命令行参数(参数)。

imo批处理中的计数步骤更简单地使用find/v/n"

完成
for /f "tokens=3 delims=: " %%A in (
  'find /V /N /C "" %listfile%'
) Do set NumLines=%%A

但是,每次运行批处理时,都会重新创建列表和hashfile,根本不需要中间步骤。
这是一个堆叠的 - 如果 - 为了一次运行:

@echo off
setlocal enabledelayedexpansion
:: Set the variables for this script.
set testfolder=c:testtest folder
set hashfile=c:testoutputmd5-hashes.csv
>%hashfile% (
  echo "File","MD5-hash"
  For /f "delims=" %%A in (
    'dir /s /b /a-d "%testfolder%"'
  ) Do If %%~sA Gtr 0 For /f "delims=" %%B in (
    'certutil -hashfile %%A MD5 ^|findstr /i ^[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f]'
  ) Do Echo:"%%~A","%%~B"
)

此部分输出恰好引用了可能更适合此任务的工具: - )

> type md5-hashes.csv
"File","MD5-hash"
"c:testmd5hashdeep.exe","23 03 ea 53 52 03 c7 93 05 49 0d 6c 20 be 84 54"
"c:testmd5hashdeep64.exe","66 5c cc 57 a8 4c 56 39 c4 e5 15 16 86 cc 04 32"
"c:testmd5md5deep.exe","23 03 ea 53 52 03 c7 93 05 49 0d 6c 20 be 84 54"
"c:testmd5md5deep64.exe","66 5c cc 57 a8 4c 56 39 c4 e5 15 16 86 cc 04 32"

相关内容

  • 没有找到相关文章

最新更新