-2

编者注:
这个问题的要点是:
*如何将自定义属性添加到Get-ChildItem包含派生路径信息的对象输出,即父文件夹路径(asFolder和名称(as Foldername)?
*如何将生成的对象导出到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
4

1 回答 1

3

for files 返回的[System.IO.FileInfo]实例Get-ChildItem没有FolderorFolderName属性。

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

Select-Object允许基于哈希表的属性定义,即所谓的计算属性,它允许您通过脚本块重命名和/或转换属性和/或添加从其他属性值派生的自定义属性。

注意:您还可以将计算属性与Format-TableFormat-Listcmdlet一起使用,以创建仅用于显示的输出(以及与其他 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

请注意,或者,您可以通过 向输入对象添加Folder和属性,就像您对问题中的属性所做的那样。FolderNameAdd-MemberOwner

说明

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

  • @{ ... }传递给的每个构造Select-Object都是一个哈希表,它定义了一个附加到每个输出对象的属性:

    • 哈希表必须有两个条目
      • Name Label,它定义了属性的名称;为简洁起见,您可以使用键名的(不区分大小写)前缀,例如 justnl.
      • Expression,它定义了属性的;同样,键名的(不区分大小写)前缀也可以使用,例如e.
        • 如果您只是想重命名输入属性,则表达式可以只是一个属性名称(一个字符串),但更典型的是一个脚本块( ),它是为每个输入对象执行的一段代码,其输出成为被定义属性的值;在该脚本块内,自动变量(或)指的是手头的输入对象。{ ... }$_$PSItem
  • 属性的定义Folder Convert-Path $_.PSParentPathPSParentPath属性包含的完全限定的 PowerShell 路径(包括标识驱动器提供程序的前缀)转换为常规文件系统路径;例如,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,仅在Windows PowerShell中需要(幸运的是,PowerShell (Core) 7+ 现在一直使用 BOM-less UTF-8),确保正确编码非 ASCII 字符;默认情况下,Export-Csv使用 ASCII 编码,简单地将非 ASCII 字符(例如外来字母)替换为逐字 ?字符,导致信息丢失;请注意,-Encoding Utf8在 Windows PowerShell 中总是创建带有 BOM 的UTF-8 文件。

    • -NoTypeInformation,同样仅在Windows PowerShellExport-Csv中需要,取消默认添加为输出文件第一行的行,该行包含输入对象的完整类型名称(类名)(例如,#TYPE System.Management.Automation.PSCustomObject;这是为了便于以后重新转换为对象)。

于 2016-10-04T21:18:17.047 回答