Создавать объекты с пользовательскими свойствами, содержащими информацию о пути к производной файловой системе, и экспортировать их в 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
в CSVOut.csv
где имена свойств входных объектов становятся строкой заголовка, а свойство определяет строки данных.-Encoding Utf8
обеспечивает правильное кодирование не-ASCII символов; по умолчанию,Export-Csv
использует кодировку ASCII и просто отбрасывает не-ASCII символы, такие как иностранные буквы.-NoTypeInformation
подавляет линию, котораяExport-Csv
по умолчанию добавляет в качестве первой строки выходного файла, который содержит полное имя типа (имя класса) входных объектов (например,#TYPE System.Management.Automation.PSCustomObject
; это должно облегчить последующее преобразование в объекты).