You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell执行Start-Process调用msiexec时抛出位置参数错误但安装仍成功的问题求助

解决Start-Process执行MSI安装时的参数错误问题

这个问题的根源在于你对PowerShell中Start-Process的参数传递方式理解有误,而且括号的使用导致了意外的行为——虽然安装成功了,但那是因为PowerShell先偷偷执行了你的msiexec命令,之后才抛出Start-Process的错误。

错误原因分析

你的原命令:

Start-Process -Wait (msiexec.exe /I “C:\Temp\MBAM 2.5\Installers\x64\MBAMClient.msi”)

这里的括号()在PowerShell中是表达式执行运算符,它会先运行括号内的msiexec.exe /I ...命令,完成MSI安装。之后,它会把这个命令的退出码(通常是0表示成功)作为参数传给Start-Process。而Start-Process期望第一个参数是要启动的可执行文件路径,它找不到名为0的程序,所以抛出了"A positional parameter cannot be found..."的错误。

正确的写法

你需要明确告诉Start-Process哪个是可执行文件,哪个是它的参数,有几种可靠的方式:

方式1:使用-FilePath和-ArgumentList(推荐)

Start-Process -Wait -FilePath "msiexec.exe" -ArgumentList '/I "C:\Temp\MBAM 2.5\Installers\x64\MBAMClient.msi"'

这里用单引号包裹参数列表,避免内部双引号的转义问题;如果要使用双引号,需要转义内部的双引号:

Start-Process -Wait -FilePath "msiexec.exe" -ArgumentList "/I `"C:\Temp\MBAM 2.5\Installers\x64\MBAMClient.msi`""

方式2:将参数拆分为数组(更清晰,适合复杂参数)

Start-Process -Wait -FilePath "msiexec.exe" -ArgumentList @(
    '/I',
    '"C:\Temp\MBAM 2.5\Installers\x64\MBAMClient.msi"'
)

数组方式可以让你清晰地拆分每个参数,尤其当需要添加更多msiexec参数(比如静默安装/qn)时,可读性更好。

方式3:直接调用msiexec并等待(如果不需要Start-Process的额外功能)

如果你只需要等待安装完成,也可以直接调用msiexec并结合Wait-Process:

$msiProcess = Start-Process -PassThru "msiexec.exe" -ArgumentList '/I "C:\Temp\MBAM 2.5\Installers\x64\MBAMClient.msi"'
$msiProcess | Wait-Process

或者更简洁的:

Start-Process "msiexec.exe" -ArgumentList '/I "C:\Temp\MBAM 2.5\Installers\x64\MBAMClient.msi"' -Wait

验证效果

使用上述任意一种写法后,Start-Process会正确启动msiexec并传递安装参数,等待安装完成,控制台不会再抛出错误,同时安装流程正常完成,符合规范要求。

内容的提问来源于stack exchange,提问作者George Barron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:24:23