PowerShell 文件计数行为

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]>

一切都很好;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]>

尽管过滤器应该返回 1 个文件,但“.Count”没有返回任何内容。我认为这是一个错误的计数...

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

或者,请随意责骂我,因为我肯定犯了明显的新手错误。

谢谢!

答案1

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

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

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

    (Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
    

答案2

我试图获取目录中的文件类型数量来决定是否处理该文件夹。

虽然上述方法有效,但更好的解决方案可能是使用 Test-Path 来检查特定文件或文件类型是否存在。

相关内容