Хеши md5 в PowerShell (или CMD) с относительными путями к файлам - PullRequest
1 голос
/ 03 июня 2019

Я хотел бы записать хеши md5 для всех файлов в каталоге и его подкаталогах в файл.В идеале, реплицировать вывод команды unix find . -type f -exec md5sum {} + (т.е. два столбца: хэши и относительные пути к файлам).

Я смотрел на команду CMD CertUtil -hashfile afile.txt MD5, но застрял с полными указанными путями к файламна dir /A:-D /B /S.Я нашел следующий ответ с помощью PowerShell: https://superuser.com/a/1249418. Я использовал CMD очень редко, и это моя первая попытка PowerShell.

Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse | Resolve-Path -Relative | Tee-Object -Variable y) | select hash | Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\temphashes.txt
$x = (Get-Content C:\Users\MYUSERNAME\Desktop\MYFOLDER\temphashes.txt).ToLower() | select -skip 3 | ?{$_.Trim(" `t")}
$i = 0; $x | ForEach-Object {($_, $y[$i]) -join " "; $i++} | Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\hashes.txt

Есть ли лучший способ получить хэши и относительныепути в PowerShell (или CMD)?Или, по крайней мере, можно ли перезаписать промежуточный файл `temphashes.txt 'конечным выводом?

Редактировать: можно ли сделать хэши строчными, а заголовки и лишние завершающие пустые строки удалить (см. Вторую строкув моей попытке) так файл выглядит так:

d41d8ce98f00b204e9800988ecf8427e .\aSubDirectory\anotherfile.txt
4615fd7b904c04e94cbeced23361c778 .\afile.txt

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Получает ли это то, что вы ищете?

$Files = Get-ChildItem "*.*" -Recurse

$Result = ForEach ($File in $Files) {
    Get-FileHash $File -Algorithm MD5 | Select-Object Hash,@{N='Path';E={$_.Path | Resolve-Path -Relative}}
} 

$Result | Out-File C:\Users\MYUSERNAME\Desktop\MYFOLDER\hashes.txt

Пояснение:

  • Извлекает все файлы, используя Get-ChildItem, в переменную с именем $Files.
  • Перебирает каждый файл и использует Get-FileHash для извлечения FileHash, который также возвращает полный путь как путь.
  • Передайте этот результат в Select-Object и выберите только свойство Hash, используя Вычисляемое свойство , чтобы вернуть Path в качестве относительного пути.
  • Результаты цикла ForEach возвращаются в переменную $Result, которая затем выводится в файл с Out-File.
1 голос
/ 03 июня 2019

Примерно так:

Get-ChildItem -Path $path -Recurse | 
    Get-FileHash -Algorithm MD5 | 
    Select-Object "Hash","Path" | 
    ConvertTo-Csv -NoTypeInformation | 
    Out-File -FilePath "files.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...