我是 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 属性,因此您不会得到任何结果。有几种方法可以解决这个问题:
通过将返回值包装在数组运算符中,强制将其保留为数组
@()
:@(Get-ChildItem c:\pstdump -filter "*.pst").Count
使用 Measure-Object cmdlet:
(Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
答案2
我试图获取目录中的文件类型数量来决定是否处理该文件夹。
虽然上述方法有效,但更好的解决方案可能是使用 Test-Path 来检查特定文件或文件类型是否存在。