使用PowerShell计算整个光盘的哈希值

使用PowerShell计算整个光盘的哈希值,powershell,hash,checksum,iso-image,Powershell,Hash,Checksum,Iso Image,我正试图找到一种使用PowerShell创建CD或DVD校验和/哈希的方法。我知道Get Filehash在文件上运行得很好,但我不知道如何在光媒体上运行。我想我可能可以使用Get Content获取比特流并将其传输到Get Filehash,但是运行Get Content-Path D:\(其中D:是光盘)返回一个“对路径“D:\”的访问被拒绝。Get Volume似乎只返回具有属性的对象,而不是比特流 我已经有了光盘的ISO映像文件。我正在尝试获取整个原始光盘上的校验和,以与ISO进行比较,

我正试图找到一种使用PowerShell创建CD或DVD校验和/哈希的方法。我知道
Get Filehash
在文件上运行得很好,但我不知道如何在光媒体上运行。我想我可能可以使用
Get Content
获取比特流并将其传输到
Get Filehash
,但是运行
Get Content-Path D:\
(其中D:是光盘)返回一个“对路径“D:\”的访问被拒绝。
Get Volume
似乎只返回具有属性的对象,而不是比特流

我已经有了光盘的ISO映像文件。我正在尝试获取整个原始光盘上的校验和,以与ISO进行比较,以确保它被正确地撕开


有任何建议或指针吗?

在您的示例中,
获取内容-路径D:\
失败,因为您没有指向文件。从:

-路径

指定Get Content获取内容的项的路径。 允许使用通配符。路径必须是指向项的路径, 不指向容器。例如,必须指定指向一个或多个容器的路径 文件,而不是目录的路径

也就是说,光盘驱动器不是该cmdlet的问题;如果在
C://
驱动器上尝试此操作,您将看到相同的错误

从这个问题来看,我不确定您的光盘驱动器是否包含提取的ISO或仅包含ISO,但类似的内容应该会让您开始:

Get-ChildItem -Path d:\ -Recurse -File | foreach { 
    Get-FileHash $_.FullName; 
}

如果我正确理解了这个问题,您希望获得CD上所有内容的哈希值(获取整个原始光盘上的校验和)

为此,您可以使用以下帮助器功能:

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:\

希望有帮助

我想出了以下方法:

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
}
函数散列媒体([string]$drive,[string]$algorithm){
散列媒体e:SHA256
43E2B7D5142592222FFA39F7AB1570691B8D14AAF0186D2A44CA07581F5FEBA
#>
$raw\u stream=[System.IO.File]::打开('\\.\'+$drive,'Open','Read','Read')
$hash=Get FileHash-InputStream$raw\u stream-Algorithm$算法
返回$hash.hash
}

这返回的值与在ISO文件烧录之前直接检查该文件的值相同。

感谢您指出Get Content的问题。我也尝试过它
Get Content-Path D:\-Encoding Byte-Raw
,因为我没有得到特定的文件,但没有运气。我很欣赏它的出发点,但我不认为它是我想要的ng代表。我想为整个光盘获取一个校验和,而不是为光盘上的每个文件获取一个校验和。我想你可以将光盘称为提取的ISO;我正在处理人们刻录的各种数据光盘。@Nathan-ISO是一个文件。我不认为你可以将单个原始ISO的校验和与一组文件进行比较(我想这就是你说的“整个光盘”的意思),除非你把光盘上的文件合并成一个ISO,然后运行校验和。”把光盘上的文件合并成一个ISO,然后运行校验和“有点。我一直在研究这个问题,但将它保持在流中并将其传送到
Get FileHash
,以便能够验证ISO是光盘的逐位拷贝。谢谢!似乎PowerShell不允许您打开原始设备。我已经能够通过使用
open('\.\d:','rb')成功地使用Python实现这一点。”
,其中
d:
是驱动器名。我找不到PowerShell打开该路径的方法。如果您有权访问Cygwin,则可以使用
sha1sum/dev/scd0
(您可以使用任何
shaXsum
命令)。到目前为止,我还没有找到任何本机PowerShell方法。Python脚本的参考:谢谢,@Theo。这是我一直在寻找的,但我不确定这到底是我所需要的。这将计算所有校验和的校验和。但是,MD5不等于从D:\中的光盘创建的ISO文件的MD5。经过反思,这使得nse,iso将有文件系统信息和空白扇区,这是iso的一部分,上面的解决方案没有考虑到。可能没有办法实现我所希望的,从我所读到的来看,PowerShell不是创建iso的最佳工具,我想这就是我需要做的,创建iso instream并获取其校验和…谢谢!什么是prGram是您用来创建ISO的吗?我使用了两个不同的程序,在这些文件上得到了相同的哈希值,但在我使用此函数时,磁盘上的哈希值都不匹配。就个人而言,我通常使用mkisofs(Linux/Cygwin)。有些应用程序支持.ISO文件,有些则不支持。在工作中,我们与Roxio的关系很好。其他应用程序(像Starburn)刻录时请修改光盘上的元数据,这样散列就永远不会匹配。DVD和Bluray似乎可以正常工作,而CDR不能正常工作。另外,请确保在刻录介质时使用DAO或SAO,这样可以在刻录时关闭光盘。刻录后关闭光盘将更改散列。您可以使用dd从介质制作iso或通过witi修改上述内容将流重新加载到文件中,而不是将其发送到获取FileHash。