为什么在包含1个文件和文件夹包含2个或更多文件的文件夹之间使用Get-ChildItem时会得到不同的结果

时间:2016-03-05 01:42:47

标签: powershell

示例我有

\目录\ 1fies
      - >包含1个文件1my.mdl
\目录\ 2fies
      - >包含2个文件1my.mdl和2my.mdl

然后我尝试使用Get-ChildItem $ files.length来计算文件,我在包含1个文件的文件夹和包含2个文件的文件夹之间得到了不同的结果?

[String]$CP=Split-Path $MyInvocation.MyCommand.Path

[String]$PathtoCount=$CP+"\1file"
$files = Get-ChildItem $PathtoCount -Filter *.mdl 
write-host Count of file : $files.length

[String]$PathtoCount=$CP+"\2file"
$files = Get-ChildItem $PathtoCount -Filter *.mdl 
write-host Count of file : $files.length

上面的代码给出了结果

Count of file : 542  
Count of file : 2

但如果我使用$ files.count,它将给出正确的结果

[String]$CP=Split-Path $MyInvocation.MyCommand.Path

[String]$PathtoCount=$CP+"\1file"
$files = Get-ChildItem $PathtoCount -Filter *.mdl 
write-host Count of file : $files.length

[String]$PathtoCount=$CP+"\2file"
$files = Get-ChildItem $PathtoCount -Filter *.mdl 
write-host Count of file : $files.length

[String]$PathtoCount=$CP+"\1file"
$files = Get-ChildItem $PathtoCount -Filter *.mdl 
write-host Count of file : $files.count

[String]$PathtoCount=$CP+"\2file"
$files = Get-ChildItem $PathtoCount -Filter *.mdl 
write-host Count of file : $files.count

结果:

Count of file : 542
Count of file : 2
Count of file : 1
Count of file : 2

感谢您的解释,对不起我的不好意思。

2 个答案:

答案 0 :(得分:2)

当命令返回多个结果时,它们将作为对象数组分配给变量,但是,当返回单个结果时,您只获得返回的对象。在您的示例的第一部分中,$ files被分配了一个类型为" System.IO.FileInfo"的单个对象。因此,当评估$ files.Length时,您将从" System.IO.FileInfo"获取Length属性。返回的对象。在代码的下一部分中,$ files被分配了一个对象数组。因此,当这次评估$ files.Length时,您将从" System.Object []"获取Length属性的值。为了始终保证返回一组对象,您可以使用" @()"来强制您的结果。数组子表达式运算符。

如果您发现下面的代码,我已经使用' @()'封锁了您对Get-ChildItem的调用。操作

[String]$CP=Split-Path $MyInvocation.MyCommand.Path

[String]$PathtoCount=$CP+"\1file"
$files = @(Get-ChildItem $PathtoCount -Filter *.mdl)
write-host Count of file : $files.length

[String]$PathtoCount=$CP+"\2file"
$files = @(Get-ChildItem $PathtoCount -Filter *.mdl)
write-host Count of file : $files.length

当这个运行时,你应该得到你期望的结果。

答案 1 :(得分:0)

Bob M's helpful answer很好地解释了这个问题。

如果您使用的是Powershell v3 + ,您还可以使用{strong>使用.Count属性统一处理标量和集合 代替:

> $scalar = ''; $scalar.length; $scalar.count
0    # the string scalar's *string-length* property
1    # the *count of items* in the collection; $scalar is an implied collection with *1* el.

换句话说:在PS v3 +中,$files.Count(与$file.Length相对)应该提供所需的结果,即使Get-ChildItem碰巧只返回文件(或根本没有)。