Создавать объекты с пользовательскими свойствами, содержащими информацию о пути к производной файловой системе, и экспортировать их в CSV - рассчитанные свойства

Примечание редактора:
Суть этого вопроса:
* Как добавить пользовательские свойства к объектам, выводимым Get-ChildItem которые содержат информацию о производном пути, а именно путь родительской папки (как Folder и имя (как Foldername )?
* Как мне экспортировать полученные объекты в файл CSV?

В настоящее время запущен скрипт, который я взял из Stackru и изменил для собственного использования. Цель сценария - посмотреть каталог, получить имена файлов и экспортировать их в каталог как файл.csv.

Мне удалось изменить сценарий, чтобы вытащить только имя файла, как первоначально он только вытащил через path, user и т.д. смог сделать это, добавив ,Name, По какой-то причине я не могу заставить скрипт пройти через родительскую папку, в которой он находится, также требуя родительскую папку родителей.

Я считаю, что с этой частью кода у меня больше всего проблем. На select Я смог добавить ,Name но добавляя ,folder или же ,foldername после select не проходит правильно

ForEach-Object {$_ | Add-Member -Name "Owner" -MemberType NoteProperty -Value (Get-Acl $_.FullName).Owner -PassThru} | 
 Sort-Object fullname | 
  Select FullName,CreationTime,LastWriteTime,Owner,Name,Folder,Foldername

1 ответ

Решение

[System.IO.FileInfo] экземпляры возвращены Get-ChildItem для файлов нету Folder или же FolderName свойства.

Get-ChildItem -File $HOME\Desktop | Get-Member Например, покажет вам доступные свойства и покажет, что желаемая информация может быть получена из PSPath а также PSParentPath свойства.

Select-Object позволяет определения свойств на основе хеш- таблиц, так называемые вычисляемые свойства, которые позволяют переименовывать и / или преобразовывать свойства и / или добавлять пользовательские свойства, полученные из других значений свойств, с помощью блока скрипта.

Примечание: Вы также можете использовать рассчитанные свойства с Format-Table а также Format-List Командлеты для создания вывода только для отображения.

Упрощенный пример того, что вы ищете (включает вывод в файл CSV):

Get-ChildItem $HOME\Desktop | Select-Object Name,
  @{ n = 'Folder'; e = { Convert-Path $_.PSParentPath } },
  @{ n = 'Foldername'; e = { ($_.PSPath -split '\\')[-2] } } |
    Export-Csv Out.csv -Encoding Utf8 -NoTypeInformation

Обратите внимание, что, в качестве альтернативы, вы можете добавить Folder а также FolderName свойства для входных объектов через Add-Member , как вы делаете с Owner в вашем вопросе.

Пояснение:

Обратите внимание, что вы можете получить более подробную информацию о любой из упомянутых команд, запустив Get-Help <command-name> -Full ; добавлять -online просмотреть раздел справки в браузере; чтобы узнать больше о -split оператор, запустить Get-Help about_split; чтобы узнать о справочной системе PowerShell в целом, запустите Get-Help Get-Help -online,

  • каждый @{ ... } конструкция передана Select-Object хеш-таблица, которая определяет свойство для присоединения к каждому выходному объекту:

    • Хеш-таблица должна содержать две записи:
      • Name или же Label, который определяет имя свойства; для краткости вы можете использовать (без учета регистра) префикс имени ключа, например просто n или же l,
      • Expression, который определяет значение свойства; опять же (без учета регистра) префикс имени ключа тоже работает, например просто e,
        • Выражение может быть простым именем свойства (строкой), если вы просто хотите переименовать входное свойство, но чаще это блок скрипта ({ ... }), который представляет собой фрагмент кода, который выполняется для каждого входного объекта, и вывод которого становится значением определяемого свойства; внутри этого блока скрипта, автоматическая переменная $_ (или же $PSItem) относится к входному объекту под рукой.
  • Значение Folder имущество: Convert-Path $_.PSParentPath преобразует полный путь PowerShell, который PSParentPath свойство содержит - который включает префикс, идентифицирующий провайдера диска - к обычному пути файловой системы; например, Microsoft.PowerShell.Core\FileSystem::C:\Users\jdoe\Desktop -> C:\Users\jdoe\Desktop,

  • Значение Foldername имущество: ($_.PSPath -split '\\')[-2] разбивает полный путь на компоненты по разделителю пути \ и затем получает доступ к последнему-последнему компоненту (-2), который является именем родительской папки; например, C:\Users\jdoe\Desktop\file.txt -> Desktop

    • '\\' должен использоваться для представления \, так как -split Первый операнд RHS является регулярным выражением, где \ имеет особое значение и поэтому должен быть удвоен, чтобы быть принятым за буквальное.
    • Если вы хотели поддержать / в качестве разделителя пути, а также для межплатформенной поддержки, вы бы использовали ($_.PSPath -split '[\\/]')[-2],
  • Export-Csv экспортирует вывод объектов Select-Object в CSV Out.csvгде имена свойств входных объектов становятся строкой заголовка, а свойство определяет строки данных.

    • -Encoding Utf8 обеспечивает правильное кодирование не-ASCII символов; по умолчанию, Export-Csv использует кодировку ASCII и просто отбрасывает не-ASCII символы, такие как иностранные буквы.

    • -NoTypeInformation подавляет линию, которая Export-Csv по умолчанию добавляет в качестве первой строки выходного файла, который содержит полное имя типа (имя класса) входных объектов (например, #TYPE System.Management.Automation.PSCustomObject; это должно облегчить последующее преобразование в объекты).

Другие вопросы по тегам