创建具有包含派生文件系统路径信息的自定义属性的对象,并将它们导出到 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]
个实例没有 Folder
或 FolderName
属性。
Get-ChildItem -File $HOME\Desktop | Get-Member
,例如,将向您展示可用的属性,并将向您展示所需的信息可以 从 PSPath
和PSParentPath
个属性。
Select-Object
allows hashtable-based property definitions, so-called calculated properties,允许您重命名 and/or transform 属性 and/or 添加自定义属性 通过脚本块从其他 属性 值派生。
注意:您还可以将计算属性与 Format-Table
和 Format-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-Member
将 Folder
和 FolderName
属性添加到输入 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必须有两个条目:
Name
或Label
,定义了属性的姓名;为简洁起见,您可以使用键名的 (case-insensitive) 前缀,例如 n
或 l
.
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-Csv
将 Select-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).
编者按:
这个问题的要点是:
* 如何向 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]
个实例没有 Folder
或 FolderName
属性。
Get-ChildItem -File $HOME\Desktop | Get-Member
,例如,将向您展示可用的属性,并将向您展示所需的信息可以 从 PSPath
和PSParentPath
个属性。
Select-Object
allows hashtable-based property definitions, so-called calculated properties,允许您重命名 and/or transform 属性 and/or 添加自定义属性 通过脚本块从其他 属性 值派生。
注意:您还可以将计算属性与 Format-Table
和 Format-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-Member
将 Folder
和 FolderName
属性添加到输入 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必须有两个条目:
Name
或Label
,定义了属性的姓名;为简洁起见,您可以使用键名的 (case-insensitive) 前缀,例如n
或l
.Expression
,它定义了属性的值;同样,键名的 (case-insensitive) 前缀也可以,例如e
。- 表达式可以只是一个 属性 name (一个字符串),以防你只是想 rename 一个输入 属性,但更典型的是 脚本块 (
{ ... }
),它是针对每个输入 object 执行的一段代码,并且其输出成为正在定义的 属性 的值;在该脚本块中,自动变量$_
(或$PSItem
)指的是手头的输入 object。
- 表达式可以只是一个 属性 name (一个字符串),以防你只是想 rename 一个输入 属性,但更典型的是 脚本块 (
- 散列table必须有两个条目:
定义
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-Csv
将Select-Object
输出的 objects 导出到 CSVOut.csv
,其中输入 objects' 属性 名称成为 header 行,而 属性 值成为数据行。
的 UTF-8 文件-Encoding Utf8
,仅在 Windows PowerShell 中需要(幸运的是,PowerShell (Core) 7+ 现在始终使用 BOM-less UTF-8),确保 non-ASCII 个字符被正确编码;默认情况下,Export-Csv
使用ASCII编码,简单地将non-ASCII个字符,如外文字母,替换为verbatim?
个字符,导致信息丢失;请注意 Windows PowerShell 中的-Encoding Utf8
总是 创建带有 BOM.-NoTypeInformation
,仅在 Windows PowerShell 中再次需要,禁止Export-Csv
默认添加为输出文件的第一行,其中包含输入 object 的完整类型名称(class 名称)(例如,#TYPE System.Management.Automation.PSCustomObject
;这是为了方便以后重新转换为 objects).