.count在多个PowerShell版本

问题描述:

我有一个powershell脚本的一部分,检查位置和验证文件的计数,然后根据计数运行检查。 powershell脚本运行在多台机器上,其中一台运行powershell 2.0。.count在多个PowerShell版本

我使用的是一样的东西:

$folder = Get-Item "Parent Folder" 
$files = (Get-ChildItem $folder.Fullname) 

当我检查$files.Count它会在PowerShell中大于2.0的版本准确。 在Powershell 2.0中,如果$files只包含1个文件,则files.Count不会返回任何内容。如果有多个文件,则它返回正确的数量(非空)。

我假设这与$files不是一个数组,如果Get-ChildItem只返回一个值。

我知道检查PowerShell版本并修改每个版本的脚本将解决此问题,但我宁愿避免它。

有没有其他方法可以在多个版本的PowerShell中统一检查计数?

这是一个已知的问题,您必须将PS 2.0的返回值转换为数组。它被固定在PS 3.0:

您现在可以使用任何对象计数或长度,即使没有 财产吧。如果该对象没有Count或Length属性,则它将返回1(或0为$ null)。具有Count或 长度属性的对象将像以往一样继续工作。

实施例:

$files = @(Get-ChildItem $folder.Fullname) 

[array]$files = Get-ChildItem $folder.Fullname 

参考文献:

+2

恕我直言,不使用转换''[数组]'。它在空管道的情况下不会返回空数组。如果管道返回单个元素并且该单个元素是集合,那么转换为'[array]'将把集合的元素复制到数组,而不是像'@()'那样将元素包装到单个元素数组中。 – PetSerAl

+0

@PetSerAl同意,谢谢澄清。有时''[array]'行为更可取,因为如果返回值为空,它将包含'$ null',可以使用比较运算符轻松地进行比较。对于空数组来说并不那么简单,因为当用于数组时,[比较运算符不会返回布尔值($ true或$ false)。他们返回符合条件的数组的所有成员。](http://stackoverflow.com/a/29614241/4424236) – beatcracker

+0

如果数组为空,则可以比较'$ array.Count -eq 0'或'不是$ array.Count'。 – PetSerAl