Вопрос или проблема
Я пытаюсь создать скрипт на 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"
Объяснение кода:
-
Определение пути для экспорта: Мы используем
Join-Path
, чтобы создать полный путь для выхода (file_info.csv
), который будет сохранён в том же каталоге, что и скрипт. -
Создание массива: Для хранения информации о файлах используется массив
$fileInfoList
. -
Рекурсивный обход файлов: Команда
Get-ChildItem
с параметрами-Recurse -File
возвращает все файлы в указанной директории и её подпапках. Обратите внимание на то, что здесь нужно указать реальный путь к вашей папке вместоC:\path\to\your\folder
. -
Сбор информации о каждом файле:
$_
ссылается на текущий элемент в процессе перебора.- Мы вычисляем относительный путь к файлу от корня, подлежащего обработке, а также получаем его размер и хеши с использованием
Get-FileHash
.
-
Создание объекта с информацией о файле: Каждый файл представляется в виде объекта
PSCustomObject
, что упрощает работу с данными и последующий экспорт. -
Экспорт в CSV: После сбора информации она экспортируется в CSV-файл, где параметр
-NoTypeInformation
убирает ненужные заголовки, а-Encoding UTF8
отвечает за кодировку. -
Вывод сообщения об успешном экспорте: После завершения скрипта пользователю будет показано сообщение о том, что информация успешно экспортирована.
Заключение
Этот скрипт эффективно и полностью отвечает требованиям вашей задачи, включая хеширование файлов и вывод информации в понятном формате CSV. Запустив его, вы сможете получить всю необходимую информацию о файлах в заданной директории и её подпапках.