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
相关产品推荐
相关产品推荐

