我是 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 错误。
谢谢!
称其为怪癖或功能,但这与 PowerShell 如何处理长度仅为 1 的列表有关。它“展平”了它们,使其不再是一个列表,而是一个单一的 FileInfo 对象。由于 FileInfo 对象没有 Count 属性,因此您不会得到任何结果。有几种方法可以解决这个问题:
通过将返回值包装在数组运算符中,强制返回值保留为数组@():
@(Get-ChildItem c:\pstdump -filter "*.pst").Count
Run Code Online (Sandbox Code Playgroud)使用 Measure-Object cmdlet:
(Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3980 次 |
| 最近记录: |