Как извлечь необработанный хэш из строки?

Я пытаюсь создать текстовый файл с именами файлов и их хешем 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
Другие вопросы по тегам