如何在仅剩余一个PSObject时获取其Count值?
问题场景
我通过以下代码生成PSObject集合:
$Installs = foreach($CVAFile in $CVAFiles) { $CVAFileContents = get-content $($CVAFile).fullname -raw $CVAFileContents -match '(?s).*?\[General\].*?SystemMustBeRebooted=(\d).*?\[Install Execution\].*?SilentInstall=(.*?)\n.*' | out-null $s = $CVAFile.fullname.split("\")[-1].split(".")[0] [pscustomobject]@{ SP = $s NeedsRestart = $Matches[1] SilentInstall = $Matches[2] } }
随后将其导出为CSV用于后续恢复:
$Installs | export-csv $ResumeHPImagingAssistantInstallsCSVFile -notypeinformation
后续导入CSV时使用:
$Installs = import-csv $ResumeHPImagingAssistantInstallsCSVFile
但发现:当CSV包含2条及以上数据时,$Installs是System.Object[]数组类型,具备Count属性;但仅剩余1条数据时,$Installs变为单个System.Management.Automation.PSCustomObject对象,丢失了Count等集合属性。
需要实现无论$Installs变量中包含0个、1个还是多个PSObject,都能稳定获取其数量的方法。
解决方案
以下是几种可靠的实现方式:
方法1:强制将导入结果转为数组
在导入CSV时,用数组运算符@()包裹命令,强制结果始终为数组类型,哪怕只有0或1个元素:
$Installs = @(import-csv $ResumeHPImagingAssistantInstallsCSVFile)
之后直接通过$Installs.Count获取数量即可:
- 0条数据时返回
0 - 1条数据时返回
1 - 多条数据时返回对应元素数
方法2:使用Measure-Object统计数量
不管$Installs是单个对象还是数组,都可以用Measure-Object直接统计元素数量:
$itemCount = ($Installs | Measure-Object).Count
这种方法无需修改导入逻辑,直接对已存在的$Installs变量操作即可,结果准确对应实际元素数量。
方法3:利用PowerShell的类型判断
如果不想修改导入或额外执行命令,也可以通过类型判断来获取数量:
$itemCount = if ($null -eq $Installs) { 0 } elseif ($Installs -is [array]) { $Installs.Count } else { 1 }
不过这种方法代码量稍大,前两种方案更简洁高效。
内容的提问来源于stack exchange,提问作者user66001
相关产品推荐
相关产品推荐

