示例我有
\目录\ 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
感谢您的解释,对不起我的不好意思。
答案 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
碰巧只返回单文件(或根本没有)。