使用PSRemotingJob实现动态菜单时出现IndexOf错误咨询
错误原因
PowerShell 对管道返回结果有自动拆包逻辑:当筛选结果仅为1个时,变量会被赋值为单个对象而非数组。你遇到的报错正是因为$jobList在仅匹配到1个任务时,类型为PSRemotingJob单个对象,不存在数组专属的IndexOf()方法。
解决方法
方案1(最小改动):强制将返回结果转为数组
只需要修改$jobList的赋值语句,用@()包裹查询逻辑,无论返回结果数量多少,都会统一封装为数组类型,原有代码逻辑无需其他修改:
# 原行:$jobList = Get-Job | Where-Object {$_.State -ieq 'Completed'-and $_.Name -like "*-Repair"} # 修改为: $jobList = @(Get-Job | Where-Object {$_.State -ieq 'Completed'-and $_.Name -like "*-Repair"})
方案2(更稳妥的优化):手动维护序号计数器
不依赖IndexOf()方法,遍历的同时自己计数,逻辑更清晰,也不会出现类型不匹配的问题,完整修改后的代码如下:
Write-Host "`nCurrent Repair States:" (Get-Job | Where-Object {$_.State -ieq 'Completed' -or $_.State -ieq 'Running' -and $_.Name -like "*-Repair"}) | Format-Table Name, State -HideTableHeaders # 强制转数组,保证Count属性始终正确 $jobList = @(Get-Job | Where-Object {$_.State -ieq 'Completed'-and $_.Name -like "*-Repair"}) Write-Host "Selectable Completed SCCM Client Repairs:`n" # 手动维护菜单序号 $menuNum = 1 Foreach ($menuItem in $jobList) { " {0}.`t{1}" -f $menuNum, $menuItem.Name $menuNum++ } $jobChoice = '' while ([string]::IsNullOrWhiteSpace($jobChoice)) { $jobChoice = Read-Host "`nPlease choose the Machine by number" if ($jobChoice -inotin 1..$jobList.Count) { Write-Host Write-Host (' Please try again ...') -Foreground Yellow Write-Host $jobChoice = '' } } # 选中的任务可通过下方代码获取 # $selectedRepairJob = $jobList[[int]$jobChoice - 1]
内容的提问来源于stack exchange,提问作者kinaw
相关产品推荐
相关产品推荐

