如何从字符串中提取原始哈希?

How to extract raw Hash from String?

我正在尝试创建一个文本文件,其中包含文件名及其旁边的 MD5 哈希值。不是很懂,不过是为了学习。

这是我计算哈希值的方式:

$hash = Get-FileHash -Algorithm MD5 -Path $file | Select-Object Hash

然后我将所有内容输出到一个文本文件中:

$file.Name + "`t`t" + $hash | Out-File -Append -FilePath ($destination + "inventory$i.txt")

现在每个 $hash 值看起来像这样:

@{Hash=2A396C91CB1DE5D7C7843970954CC1D4}

如何从该字符串中获取“原始”哈希值?或者它甚至是一个字符串?

在我的文本文件中,我希望它看起来像这样:

Name                    MD5 Hash
helloworld.txt          2A396C91CB1DE5D7C7843970954CC1D4

(碰巧,有人有更好的格式化方法而不是使用 `t 表示制表符吗?)

Select-Object Hash 使用从输入对象复制的单个 属性 Hash 创建一个新对象。

要从每个输入对象中获取 Hash 属性 的原始值,请改用 ForEach-Object

$hash = Get-FileHash -Algorithm MD5 -Path $file | ForEach-Object -MemberName Hash

话虽如此,您可能希望使用结果本身来创建所需的输出,而不是仅从结果中获取哈希字符串 - 这样您就可以轻松地调整脚本以在将来对多个文件进行哈希处理:

[CmdletBinding(DefaultParameterSetName = 'ByPath')]
param(
  [Parameter(Mandatory = $true, ParameterSetName = 'ByPath')]
  [string[]]$Path,

  [Parameter(Mandatory = $true, ParameterSetName = 'ByPSPath', ValueFromPipelineByPropertyName = $true)]
  [Alias('PSPath')]
  [string[]]$LiteralPath
)

process {
  Get-FileHash @PSBoundParameters |ForEach-Object {
    $fileName = Get-ItemPropertyValue -LiteralPath $_.Path -Name Name
    
    "${fileName}`t`t$($_.Hash)"
  }
}

现在您可以:

Get-ChildItem -Filter *.ext |.\yourScript.ps1 |Out-File -Append -Path path\to\output.txt