PowerShell调用Lenovo OneCLI参数解析异常无法识别--bmc问题求助
问题根因
- 复制粘贴引入的不可见控制字符:从CMD复制到PowerShell的
--bmc参数前/内部存在零宽空格、非断空格这类不可见Unicode字符,导致PowerShell解析时无法将其识别为合法的可执行文件参数,语法高亮异常就是字符异常的直接表现,手动重输入后字符是标准ASCII的-,所以能正常执行。 - PowerShell 5.1原生可执行文件参数解析逻辑存在边界缺陷:当参数包含
--前缀、特殊符号组合时,PowerShell的参数绑定器可能会错误拦截参数,不会透传给目标exe。
解决方案
1. 优先清理输入字符
所有包含--前缀的参数手动输入,不要跨终端复制粘贴,如果是脚本中固定参数,直接在编辑器中手动输入所有参数内容,避免复制引入隐形字符。
2. 强制PowerShell透传所有参数
三种稳定的调用方式,可完全避免参数解析异常:
方式1:使用Start-Process显式传参
# 定义exe路径、参数数组 $oneCliPath = "f:\temp\onecli\onecli.exe" $arguments = @( "config", "show", "SYSTEM_PROD_DATA", "--bmc", "USERID:ChangeME@192.168.1.100" ) # 同步执行并输出结果,如需捕获日志可增加-RedirectStandardOutput参数指定输出文件 Start-Process -FilePath $oneCliPath -ArgumentList $arguments -Wait -NoNewWindow
方式2:使用--%停止解析符(适用于PowerShell 3.0及以上版本)
在exe路径后加--%,PowerShell会停止后续所有参数解析,直接原样透传给目标exe,和CMD的解析逻辑完全一致:
f:\temp\onecli\onecli.exe --% config show SYSTEM_PROD_DATA --bmc USERID:ChangeME@192.168.1.100
方式3:数组传参直接调用
将所有参数放入数组后直接调用exe,PowerShell会将数组元素按顺序透传为单独参数:
$params = @("config","show","SYSTEM_PROD_DATA","--bmc","USERID:ChangeME@192.168.1.100") & f:\temp\onecli\onecli.exe $params
3. 隐形字符排查方法
如果怀疑参数有隐形字符,可以把复制的字符串转成ASCII码校验:
# 把需要校验的复制内容替换到引号内 [char[]]'--bmc' | ForEach-Object { [int]$_ } # 正常输出应为 45,45,98,109,99,出现其他数值即为存在不可见字符
内容的提问来源于stack exchange,提问作者IonutN
相关产品推荐
相关产品推荐

