PowerShell调用Array.IndexOf匹配数组值返回-1的问题求解
故障原因
匹配失效由三个核心问题共同导致:
- 调用外部可执行文件
mc.exe返回的输出行默认携带尾部回车符(\r),-OutVariable捕获输出时不会自动清除该隐藏字符,数组内实际存储的元素格式为策略名\r,和用户输入的纯字符串无法完全相等。 - 原循环逻辑顺序错位:先执行匹配判断、再读取用户输入,首次判断使用空字符串做匹配,且用户输入完成后不会立刻触发校验,需要等下一轮循环才会判断,逻辑流程错误。
Array.IndexOf方法默认执行大小写敏感的精确匹配,只要字符有任何差异(包括隐藏字符、大小写不同、前后空格)都会返回-1,不适合直接用在交互输入的校验场景。
修复代码
首先对捕获到的策略列表做统一清洗,去除每行首尾空白、隐藏的回车换行符,再调整循环流程,优先使用PowerShell原生的-in运算符做存在性判断(默认大小写不敏感,更符合交互场景需求):
# 执行命令获取策略列表,逐行清洗无效字符 $policiesList = Invoke-Expression -Command "mc.exe admin policy list $target" | ForEach-Object { $_.Trim() } $option = "" # 循环读取输入直到输入值在合法策略列表内 while ($option -notin $policiesList) { $option = Read-Host -Prompt "Enter option" # 空输入提示 if ([string]::IsNullOrWhiteSpace($option)) { Write-Host "输入不能为空,请重新输入" continue } # 非法输入提示 if ($option -notin $policiesList) { Write-Host "输入的策略不存在,请从列表中选择有效值重新输入" } } Write-Host "校验通过,选中策略:$option"
如果必须使用Array.IndexOf实现,在清洗完数组元素的基础上,也要同步对用户输入做Trim()处理,再调用方法:
$policiesList = Invoke-Expression -Command "mc.exe admin policy list $target" | ForEach-Object { $_.Trim() } $option = "" $i = -1 while($i -eq -1){ $option = (Read-Host -Prompt "Enter option").Trim() $i = [array]::IndexOf($policiesList, $option) }
注意:该写法大小写敏感,用户输入的大小写和列表内不一致时依然会匹配失败。
内容的提问来源于stack exchange,提问作者xxestter
相关产品推荐
相关产品推荐

