PowerShell 文件计数行为

Bee*_*rox 5 powershell

我是 PowerShell 的新手,对以下行为有疑问。我正在尝试计算某种类型目录中的文件数。如果有的话,我会把它们复制到别处。这是我的测试文件夹的输出;该代码是从我发现的 MSDN 示例中修改的:

[PS]> Get-ChildItem c:\pstdump

Directory: C:\pstdump

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/12/2011   9:48 AM          0 blah.pst
-a---         2/12/2011   9:36 AM          0 New Text Document.txt
-a---         2/12/2011   9:36 AM         20 New WinRAR archive.rar

[PS]> (Get-ChildItem c:\pstdump).Count
3
[PS]>
Run Code Online (Sandbox Code Playgroud)

一切顺利;PowerShell 和我同意文件夹中有 3 个文件。现在,当我想选择特定的文件类型(例如 .PST 文件)时:

[PS]> Get-ChildItem c:\pstdump -filter "*.pst"

Directory: C:\pstdump

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/12/2011   9:48 AM          0 blah.pst

[PS]> (Get-ChildItem c:\pstdump -filter "*.pst").Count
[PS]>
Run Code Online (Sandbox Code Playgroud)

即使过滤器应该返回 1 个文件,“.Count”也没有返回任何内容。我认为这是一个不正确的计数...

有人可以解释为什么返回这个“不正确”的 .Count 吗?

或者,请随时谴责我必须犯的明显的 n00b 错误。

谢谢!

zda*_*dan 6

称其为怪癖或功能,但这与 PowerShell 如何处理长度仅为 1 的列表有关。它“展平”了它们,使其不再是一个列表,而是一个单一的 FileInfo 对象。由于 FileInfo 对象没有 Count 属性,因此您不会得到任何结果。有几种方法可以解决这个问题:

  1. 通过将返回值包装在数组运算符中,强制返回值保留为数组@()

    @(Get-ChildItem c:\pstdump -filter "*.pst").Count
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 Measure-Object cmdlet:

    (Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
    
    Run Code Online (Sandbox Code Playgroud)