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



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

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

有什么建议或指示吗?

从您的示例中,Get-Content -Path D:失败,因为您没有指向文件。从获取内容文档:

-路径

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

也就是说,光驱不是该 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
}

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

最新更新