2016-10-03 2 views
-3

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

в настоящее время есть скрипт ру который я взял из StackOverflow и модифицировал для моего собственного использования. Цель скрипта - посмотреть каталог, захватить имена файлов, а затем экспортировать их в каталог в виде 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

    • '\\' должен быть использован для представления \, потому что первый RHS операнд -split «s является регулярного выражения, где \ имеет особое значение и, следовательно, должны быть удвоен следует рассматривать как буквальные.
    • Если вы хотите поддерживать / в качестве разделителя путей, а также для кросс-платформенной поддержки, вы должны использовать ($_.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, это предназначается, чтобы облегчить позже реконверсии в объекты).

Смежные вопросы