3

(Get-ChildItem -File -Recurse -Path $path).Fullname 返回全名 (Get-ChildItem -File -Recurse -Path $path).Name 数组返回文件名数组但 (Get-ChildItem -File -Recurse -Path $path).Length仅返回一个值 - 元素的计数

问题 - 如何将结果作为文件长度数组?

4

3 回答 3

6

您得到的一个值确实是结果数组的长度 - Array 类具有优先于属性枚举的显式Length属性。

要从数组中的每个项目中获取单独的Length属性值,请通过管道连接到Select-ObjectForEach-Object,如下所示:

Get-ChildItem -File -Recurse -Path $path |ForEach-Object -MemberName Length
# or 
Get-ChildItem -File -Recurse -Path $path |Select-Object -ExpandProperty Length
于 2021-05-15T13:10:40.430 回答
6

为了补充Mathias R. Jessen 的有用答案

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.FileInfoGet-ChildItem[object[]]

  • GitHub 问题 #7445讨论了这种情况模糊性,并建议引入一个专用的运算符,这样您就可以%.明确地请求常规属性访问成员枚举。

成员枚举的一个可能令人惊讶的方面是它应用管道逻辑,因为它会根据情况返回一个标量,即如果集合恰好包含一个元素

  • 例如,@(Get-Date).Year.GetType().Name返回一个System.Int32, not Object[],表示返回的是一个整数而不是一个包含整数的(单元素)数组
  • GitHub 问题 #6802讨论了这一点。

成员枚举不仅方便,而且快速,因为它避免了 PowerShell 代码中的循环/枚举。

ForEach-ObjectSelect-Object 如 Mathias 的回答所示,使用or cmdlet绝对是一种功能性缓慢的解决方法,因为使用了pipeline ,因此在给定情况下无法使用成员枚举,这对于输入是不必要的已经满满当当了

因此,使用.ForEach()数组方法- 使用只需指定目标属性名称( 'Length') 的重载 - 是一种简洁且性能更好的替代方法

  • 注意:与成员枚举不同,from 的返回值.ForEach()始终一个集合,尽管不是一个数组:它是 type [System.Collections.ObjectModel.Collection[psobject]],然而,在大多数情况下,它的行为就像一个数组。[1]

[1] 与数组不同,这种类型的集合是可扩展的(您可以添加或删除元素)。由于元素类型是[psobject],每个元素通常都被这种类型无形地包裹起来;例如,42 -is [psobject]$false,但是@(42).ForEach({ $_ })[0] -is [psobject]$true。不幸的是,在某些情况下,这种近乎不可见的包装器会导致不同的行为 - 请参阅GitHub 问题 #5579

于 2021-05-15T13:43:34.643 回答
3

在您的示例中,您将获得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
于 2021-05-15T13:12:31.553 回答