如何从字符串中提取原始哈希?
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
我正在尝试创建一个文本文件,其中包含文件名及其旁边的 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