如何解决PowerShell中System.Array与System.Object匹配结果异常问题
问题根因
$JobInfo是Invoke-Command返回的作业对象数组,直接访问数组的DJobname属性时,PowerShell会自动把所有元素的DJobname字段收集为一个新的System.Array类型数组。
PowerShell中比较运算符左侧为数组时,运算符的作用是筛选数组中符合条件的元素而非返回单个布尔值:只要筛选结果非空,if判断就会判定为条件成立,因此无论你用-match/-notmatch还是其他比较运算符,只要存在对应元素就会触发输出。
解决方案
方案1:使用数组包含运算符(推荐,语义最明确)
直接判断$D_Job是否存在于DJobname数组中即可:
if ($D_Job -in $JobInfo.DJobName) { "$D_Job Daily Job is present" }
也可以用-contains运算符实现相同效果:
if ($JobInfo.DJobName -contains $D_Job) { "$D_Job Daily Job is present" }
方案2:取单个元素比较
如果你确认查询的作业只会返回一个结果,直接取数组第一个元素的属性比较即可:
# 先判断$JobInfo非空避免索引报错 if ($JobInfo -and $JobInfo[0].DJobName -eq $D_Job) { "$D_Job Daily Job is present" }
方案3:简化原有逻辑(可选)
你原本的代码中已经通过Get-VBRJob -name $Using:D_Job按名称过滤作业,只要返回结果非空就说明作业存在,可以直接简化判断逻辑,不需要额外匹配名称:
$JobInfo = Invoke-Command -Session $PSSession -ScriptBlock { Get-VBRJob -name $Using:D_Job } if ($JobInfo) { "$D_Job Daily Job is present" }
内容的提问来源于stack exchange,提问作者user17141978
相关产品推荐
相关产品推荐

