Вычисление хэша для всего оптического медиа-диска с помощью PowerShell
Я пытаюсь найти способ создать контрольную сумму / хэш CD или DVD с помощью PowerShell. Я знаюGet-Filehash
очень хорошо работает с файлами, но я не могу понять, как это сделать для оптических носителей. Я думал, что смогу использоватьGet-Content
чтобы получить поток битов и передать его Get-Filehash
, но работает Get-Content -Path D:\
(где D: - это диск) возвращает сообщение "Доступ к пути 'D:\' запрещен. Get-Volume
только кажется, что возвращает объект со свойствами, а не битовый поток.
У меня уже есть файл образа ISO для диска. Я пытаюсь получить контрольную сумму на всем исходном диске для сравнения с ISO, чтобы убедиться, что он был скопирован правильно.
Любые предложения или указатели?
3 ответа
Если я правильно понимаю вопрос, вы хотели бы получить хеш-значение для всего на компакт-диске (получить контрольную сумму для всего исходного диска).
Для этого вы можете использовать вспомогательную функцию ниже:
function Get-FolderHash {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]
[string]$Path,
[ValidateSet('SHA1','SHA256','SHA384','SHA512','MD5')]
[string]$Algorithm = 'MD5'
)
# create a new temporary file
$temp=[System.IO.Path]::GetTempFileName()
Get-ChildItem -Path $Path -File -Recurse |
Get-FileHash -Algorithm $Algorithm |
Select-Object -ExpandProperty Hash |
Out-File -FilePath $temp -NoNewline -Encoding ascii
$hash = Get-FileHash -Path $temp -Algorithm $Algorithm
$hash.Path = $Path
Remove-Item -Path $temp
return $hash
}
Get-FolderHash D:\
надеюсь, это поможет
Из вашего примера, Get-Content -Path D:\
не выполняется, потому что вы не указываете файл. Из документации Get-Content:
-Дорожка
Задает путь к элементу, из которого Get-Content получает содержимое. Подстановочные знаки разрешены. Пути должны быть путями к элементам, а не к контейнерам. Например, вы должны указать путь к одному или нескольким файлам, а не путь к каталогу.
То есть оптический привод не является проблемой для этого командлета; вы увидите ту же ошибку, если попробуете это на своемC:/
привод.
Из вопроса я не уверен, содержит ли ваш оптический привод извлеченный ISO или только ISO, но что-то вроде этого должно вас начать:
Get-ChildItem -Path d:\ -Recurse -File | foreach {
Get-FileHash $_.FullName;
}
Я придумал следующий метод:
function Hash-Media([string]$drive, [string]$algorithm){
<#
.SYNOPSIS
Hashes the entire drive letter using the provided algorithm
.PARAMETER $drive
The drive letter, eg 'd:'
.PARAMETER $algorithm
Any algorithm acceptable by Get-FileHash, eg SHA1, SHA256, etc
.EXAMPLE
PS> Hash-Media e: SHA256
43E2B7D5142592222FFA39F7AB15706911B8D14AAF0186D2A44CA07581F5FEBA
#>
$raw_stream = [System.IO.File]::Open('\\.\' + $drive, 'open', 'Read', 'Read')
$hash = Get-FileHash -InputStream $raw_stream -Algorithm $algorithm
return $hash.Hash
}
Это возвращает то же значение, что и проверка файла ISO непосредственно перед его записью.