创建具有包含派生文件系统路径信息的自定义属性的对象,并将它们导出到 CSV - 计算属性

Create objects with custom properties containing derived filesystem path information and export them to a CSV - calculated properties

编者按:
这个问题的要点是:
* 如何向 Get-ChildItem 输出的包含派生路径信息的对象添加自定义属性,即父文件夹路径(如 Folder 和名称(如 Foldername)?
* 如何将生成的对象导出到 CSV 文件?

目前有一个脚本 运行,我从 Whosebug 获取并修改以供自己使用。该脚本的目的是查看目录,获取文件名,然后将它们作为 .csv 文件导出到目录。

我能够修改脚本以仅提取文件名,因为最初它仅提取 path, user 等。能够通过添加 ,Name 来完成此操作。出于某种原因,我无法让脚本通过它所在的父文件夹,也想要父文件夹。

我认为这部分代码是我遇到最多麻烦的地方。在 select 上,我能够添加 ,Name,但在 select 之后添加 ,folder,foldername 无法正确完成。

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

Get-ChildItem 为文件返回的 [System.IO.FileInfo] 个实例没有 FolderFolderName 属性。

Get-ChildItem -File $HOME\Desktop | Get-Member,例如,将向您展示可用的属性,并将向您展示所需的信息可以 PSPathPSParentPath 个属性。

Select-Object allows hashtable-based property definitions, so-called calculated properties允许您重命名 and/or transform 属性 and/or 添加自定义属性 通过脚本块从其他 属性 值派生。

注意:您还可以将计算属性与 Format-TableFormat-List cmdlet 一起使用,为 display[=148 创建输出=] 仅(以及其他 cmdlet - 请参阅链接的帮助主题)。

您要查找的内容的简化示例(包括 CSV 文件的输出):

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

请注意,或者,您可以通过 Add-MemberFolderFolderName 属性添加到输入 objects,就像您对你问题中的 Owner 属性。

说明:

请注意,您可以获得有关 运行ning Get-Help <command-name> -Full 提到的任何命令的更多详细信息;添加 -online 在浏览器中查看帮助主题;要了解有关 -split 运算符的更多信息,请 运行 Get-Help about_split;要了解 PowerShell 的一般帮助系统,运行 Get-Help Get-Help -online

  • 传递给 Select-Object 的每个 @{ ... } 构造是一个 散列 table,它定义了一个属性 附加到每个输出 object:

    • 散列table必须有两个条目
      • NameLabel,定义了属性的姓名;为简洁起见,您可以使用键名的 (case-insensitive) 前缀,例如 nl.
      • Expression,它定义了属性的;同样,键名的 (case-insensitive) 前缀也可以,例如 e
        • 表达式可以只是一个 属性 name (一个字符串),以防你只是想 rename 一个输入 属性,但更典型的是 脚本块 ({ ... }),它是针对每个输入 object 执行的一段代码,并且其输出成为正在定义的 属性 的值;在该脚本块中,自动变量 $_(或 $PSItem)指的是手头的输入 object。
  • 定义 Folder 属性: Convert-Path $_.PSParentPath 转换 PSParentPath 属性 包含 - 其中包括标识驱动器提供商的前缀 - 到常规文件系统路径;例如,Microsoft.PowerShell.Core\FileSystem::C:\Users\jdoe\Desktop -> C:\Users\jdoe\Desktop.

  • Foldername的定义属性:($_.PSPath -split '\')[-2]通过路径分隔符\,然后访问next-to-last组件(-2),也就是parent文件夹名;例如,C:\Users\jdoe\Desktop\file.txt -> Desktop

    • '\'必须用来表示\,因为-split的第一个RHS操作数是正则表达式,其中\ 具有特殊含义,因此必须加倍才能被视为文字。
    • 如果您想支持 / 作为路径分隔符以及 cross-platform 支持,您可以使用 ($_.PSPath -split '[\/]')[-2].
  • Export-CsvSelect-Object 输出的 objects 导出到 CSV Out.csv,其中输入 objects' 属性 名称成为 header 行,而 属性 值成为数据行。

    • -Encoding Utf8,仅在 Windows PowerShell 中需要(幸运的是,PowerShell (Core) 7+ 现在始终使用 BOM-less UTF-8),确保 non-ASCII 个字符被正确编码;默认情况下,Export-Csv使用ASCII编码,简单地将non-ASCII个字符,如外文字母,替换为verbatim?个字符,导致信息丢失;请注意 Windows PowerShell 中的 -Encoding Utf8 总是 创建带有 BOM.

      的 UTF-8 文件
    • -NoTypeInformation,仅在 Windows PowerShell 中再次需要,禁止 Export-Csv 默认添加为输出文件的第一行,其中包含输入 object 的完整类型名称(class 名称)(例如,#TYPE System.Management.Automation.PSCustomObject;这是为了方便以后重新转换为 objects).