(Get-ChildItem -File -Recurse -Path $path).Fullname
返回全名
(Get-ChildItem -File -Recurse -Path $path).Name
数组返回文件名数组但
(Get-ChildItem -File -Recurse -Path $path).Length
仅返回一个值 - 元素的计数
问题 - 如何将结果作为文件长度数组?
(Get-ChildItem -File -Recurse -Path $path).Fullname
返回全名
(Get-ChildItem -File -Recurse -Path $path).Name
数组返回文件名数组但
(Get-ChildItem -File -Recurse -Path $path).Length
仅返回一个值 - 元素的计数
问题 - 如何将结果作为文件长度数组?
您得到的一个值确实是结果数组的长度 - Array 类具有优先于属性枚举的显式Length
属性。
要从数组中的每个项目中获取单独的Length
属性值,请通过管道连接到Select-Object
或ForEach-Object
,如下所示:
Get-ChildItem -File -Recurse -Path $path |ForEach-Object -MemberName Length
# or
Get-ChildItem -File -Recurse -Path $path |Select-Object -ExpandProperty Length
tl;博士
使用.ForEach()
数组方法可以实现简洁而高效的解决方案:
# Return the files' .Length property values as a collection.
(Get-ChildItem -File -Recurse -Path $path).ForEach('Length')
正如 Mathias 的回答中所指出的那样,类型原生属性(例如.Length
数组实例)优先于您尝试执行的所谓成员枚举- 也就是说,您想要收集集合元素.Length
的属性值(array;由 ) 输出的实例,并将它们作为 ( )数组返回。System.IO.FileInfo
Get-ChildItem
[object[]]
%.
明确地请求常规属性访问或成员枚举。成员枚举的一个可能令人惊讶的方面是它应用管道逻辑,因为它会根据情况返回一个标量,即如果集合恰好包含一个元素。
@(Get-Date).Year.GetType().Name
返回一个System.Int32
, not Object[]
,表示返回的是一个整数而不是一个包含整数的(单元素)数组。成员枚举不仅方便,而且快速,因为它避免了 PowerShell 代码中的循环/枚举。
ForEach-Object
Select-Object
如 Mathias 的回答所示,使用or cmdlet绝对是一种功能性但缓慢的解决方法,因为使用了pipeline ,因此在给定情况下无法使用成员枚举,这对于输入是不必要的已经满满当当了。
因此,使用.ForEach()
数组方法- 使用只需指定目标属性名称( 'Length'
) 的重载 - 是一种简洁且性能更好的替代方法。
.ForEach()
始终是一个集合,尽管不是一个数组:它是 type [System.Collections.ObjectModel.Collection[psobject]]
,然而,在大多数情况下,它的行为就像一个数组。[1][1] 与数组不同,这种类型的集合是可扩展的(您可以添加或删除元素)。由于元素类型是[psobject]
,每个元素通常都被这种类型无形地包裹起来;例如,42 -is [psobject]
是$false
,但是@(42).ForEach({ $_ })[0] -is [psobject]
是$true
。不幸的是,在某些情况下,这种近乎不可见的包装器会导致不同的行为 - 请参阅GitHub 问题 #5579。
在您的示例中,您将获得Length
结果数组的 。
Get-ChildItem -File
返回一个数组System.IO.FileInfo
。因此,您需要获取(选择)Length
数组中每个条目的属性。这是通过使用Select-Object
或仅完成的select
:
Get-ChildItem -File -Recurse -Path $path | Select-Object Length
Length
这将为您提供一个包含文件长度作为属性的对象数组。您还可以选择多个属性:
Get-ChildItem -File -Recurse -Path $path | Select-Object Name, Length