支持资源

支持资源

有没有办法在 PowerShell 中获取集合中每个成员的属性值无需使用 Foreach环形?

例如,具有以下条目的目录:

$items

Mode                LastWriteTime         Length Name                                                                      
----                -------------         ------ ----                                                                      
-a----        3/11/2023   6:08 AM             16 file1.txt                                                                 
-a----        3/11/2023   6:08 AM             28 file2.txt                                                                 
-a----        3/11/2023   6:08 AM             34 file3.txt         

我想到获取每个对象length属性的唯一方法是:

Foreach($i in $items)
{
    $i.Length
}

有没有其他方法可以length不使用循环来获取每个对象的属性foreach

答案1

正如评论中提到的,您可以使用选择对象并使用 的标题列指定每个对象的属性名称,length并为每个对象指定一个结果bytes

$items | Select-Object Length;

输出

Length
------
 26190
  5130
  8100

您还可以使用以下方法从使用属性定义的数组对象中选择特定的属性值:计算财产使用定义的表达式来表示您要寻求的结果,而无需通过循环foreach

此 PowerShell 示例将从每个对象中选择长度属性值(以千字节为单位)。

$items | Select-Object @{Name="KBytes";Expression={ "{0:N0}" -f ($_.Length / 1KB ) }};

输出

KBytes
------
26    
5     
8

此 Powershell 示例将从每个对象中选择长度属性值(以字节为单位)。

$items | Select-Object @{Name="Bytes";Expression={ "{0:N0}" -f ($_.Length / 1 ) }};

输出

Bytes 
----- 
26,190
5,130 
8,100

此 PowerShell 还选择了长度属性,但也通过管道将其传递测量对象为您提供每个对象的具体字节数或千字节数。

$items | Select-Object @{N="Bytes"; E={ ($_ | Measure-Object -Sum Length).Sum / 1 } };

输出

Bytes
-----
26190
 5130
 8100
$items | Select-Object @{N="KBytes"; E={ ($_ | Measure-Object -Sum Length).Sum / 1KB } };

输出

      KBytes
      ------
25.576171875
 5.009765625
  7.9101562

最后(可选)对于更短的语法形式,这可能有助于简化逻辑,如果这是使用的主要目标foreach 方法循环,但代码行数较少。

$items.Foreach({$_.Length});

输出(以字节为单位)

26190
5130
8100

支持资源

答案2

还有一个隐式的 FOrEach - 通过管道将集合筛选

Filter ItemSize {$_.Length}

$Items = gci -af

$Items | ItemSize

输出:

PS > Filter ItemSize {$_.Length}
>>
>> $Items = gci -af
>>
>> $Items | ItemSize
3764
3764
2256896
46
42326
46

答案3

根据我的评论。```[0]`` 仅表示获取第一个项目。

Clear-Host
(Get-ChildItem -Path 'D:\Temp' -File)[0] 
# Results
<#
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ---- 
-a----         23-Mar-21     13:28         395347 (MSINFO32) command-line tool switches.zip 
#>

Clear-Host
((Get-ChildItem -Path 'D:\Temp' -File)[0]).Length
# Results
<#
395347
#>


$Properties = @(
'Mode',
'LastWriteTime',
'Length', 
'Name'
)
$Properteis.Count

Clear-Host
(Get-ChildItem -Path 'D:\Temp' -File)[0] | 
Select-Object -Property $Properties

# Results
<#
Mode   LastWriteTime      Length Name                                     
----   -------------      ------ ----                                     
-a---- 23-Mar-21 13:28:51 395347 (MSINFO32) command-line tool switches.zip
#>

相关内容