PowerShell: рекурсивно пройтись по папке, ее подпапкам и файлам -> экспортировать информацию о файлах в .csv

Вопрос или проблема

Я пытаюсь создать скрипт на PowerShell, который рекурсивно пройдет через определенную папку и ее подпапки, чтобы перечислить все файлы.

Кроме того, я хочу рассчитать как MD5, так и SHA1 хеши, а также размер файла в Б и экспортировать результаты в CSV.

Итак, для каждого файла мне нужно:

  • Путь к файлу, относительно его корня (где выполняется скрипт)
  • MD5-хеш
  • SHA1-хеш
  • Размер файла в Б

Мне удалось придумать следующее:

gci -Recurse -Exclude *.txt, *.ps1, *.csv | select FullName | %{get-Filehash -Algorithm md5 -Path $_.FullName ; get-FileHash -Algorithm sha1 -Path $_.FullName ; (Get-Item -Path $_.FullName).Length} | export-csv -Path $PSScriptRoot\md5hashes.csv -NoTypeInformation

В PowerShell это выглядит нормально, но в .csv нет размера файла.

Большое спасибо за ваше время заранее!

Ответ или решение

Для решения задачи, которую вы описали, мы можем написать PowerShell-скрипт, который будет рекурсивно обходить указанную папку и её подпапки, собирая информацию о каждом файле: путь к файлу, MD5-хеш, SHA1-хеш и размер файла в байтах. Далее мы экспортируем полученные данные в CSV-файл. Ниже представлено решение с комментариями для понятности.

# Получаем текущий каталог скрипта для экспорта CSV
$exportPath = Join-Path -Path $PSScriptRoot -ChildPath "file_info.csv"

# Создаем массив для хранения информации о файлах
$fileInfoList = @()

# Обход всех файлов в текущем каталоге и подпапках
Get-ChildItem -Path 'C:\path\to\your\folder' -Recurse -File | ForEach-Object {
    # Получаем информацию о файле
    $filePath = $_.FullName
    $relativePath = $_.FullName.Substring($PSScriptRoot.Length + 1)
    $fileSize = $_.Length
    $md5Hash = (Get-FileHash -Path $filePath -Algorithm MD5).Hash
    $sha1Hash = (Get-FileHash -Path $filePath -Algorithm SHA1).Hash

    # Создаем объект с необходимой информацией
    $fileInfo = [PSCustomObject]@{
        'RelativePath' = $relativePath
        'MD5Hash' = $md5Hash
        'SHA1Hash' = $sha1Hash
        'FileSize(Bytes)' = $fileSize
    }

    # Добавляем объект в массив
    $fileInfoList += $fileInfo
}

# Экспортируем собранные данные в CSV
$fileInfoList | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8

Write-Host "Информация о файлах успешно экспортирована в $exportPath"

Объяснение кода:

  1. Определение пути для экспорта: Мы используем Join-Path, чтобы создать полный путь для выхода (file_info.csv), который будет сохранён в том же каталоге, что и скрипт.

  2. Создание массива: Для хранения информации о файлах используется массив $fileInfoList.

  3. Рекурсивный обход файлов: Команда Get-ChildItem с параметрами -Recurse -File возвращает все файлы в указанной директории и её подпапках. Обратите внимание на то, что здесь нужно указать реальный путь к вашей папке вместо C:\path\to\your\folder.

  4. Сбор информации о каждом файле:

    • $_ ссылается на текущий элемент в процессе перебора.
    • Мы вычисляем относительный путь к файлу от корня, подлежащего обработке, а также получаем его размер и хеши с использованием Get-FileHash.
  5. Создание объекта с информацией о файле: Каждый файл представляется в виде объекта PSCustomObject, что упрощает работу с данными и последующий экспорт.

  6. Экспорт в CSV: После сбора информации она экспортируется в CSV-файл, где параметр -NoTypeInformation убирает ненужные заголовки, а -Encoding UTF8 отвечает за кодировку.

  7. Вывод сообщения об успешном экспорте: После завершения скрипта пользователю будет показано сообщение о том, что информация успешно экспортирована.

Заключение

Этот скрипт эффективно и полностью отвечает требованиям вашей задачи, включая хеширование файлов и вывод информации в понятном формате CSV. Запустив его, вы сможете получить всю необходимую информацию о файлах в заданной директории и её подпапках.

Оцените материал
Добавить комментарий

Капча загружается...