Как извлечь необработанный хэш из строки?
Я пытаюсь создать текстовый файл с именами файлов и их хешем 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 для табуляторов?)
1 ответ
Select-Object 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