我正在嘗試使用檔案名及其旁邊的 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 來表示制表符嗎?)
uj5u.com熱心網友回復:
Select-Object HashHash創建一個具有從輸入物件復制的單個屬性的新物件。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454143.html
