Вычисление хэша для всего оптического медиа-диска с помощью 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 непосредственно перед его записью.

Другие вопросы по тегам