远程机器通过PowerShell执行带参数msiexec失败求助
远程执行msiexec时参数无法传递的问题解决
尝试用PowerShell的Invoke-Command在远程机器上运行msiexec.exe,但参数无法传递给安装程序,试过以下两种写法:
第一种写法
$params = @( $DataPath = 'C:\Program Files (x86)\path' $Type = "Dev" $DbUser="User" $DbPassword="password" $sqlServerUser= "user" $sqlServerPassword="password" $QMName="name" $QMAddress="address" $QMPort="1212" $MqUser="user" $MqPassword="password" $SERVER_TYPE="Dev" $RUNTIME_SQL_AUTH_TYPE="WINDOWS_AUTH" $SQL_AUTH_TYPE="WINDOWS_AUTH" $RECYCLING_TIME="03:00" ) $InstallerPath = "$Path.msi" $scriptInstallServer = { (Start-Process -FilePath "msiexec.exe" -ArgumentList "/i $Using:InstallerPath /qn /norestart $Using:params" -Wait -Passthru).WaitForExit() } Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock $scriptInstallServer
第二种写法
Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock {msiexec /i $Using:serverInstallerPath $Using:params /passive}
已参考多个关于PowerShell远程安装MSI的Stack Overflow问答,但问题仍未解决。
问题根源
原代码中$params的定义完全错误:用数组语法@()包裹变量赋值语句,这只会执行一系列变量赋值操作,并不会生成msiexec需要的参数数组,最终$params是空数组,导致没有参数传递给安装程序。
另外,msiexec接收的参数需要是PROPERTY=VALUE的格式,且含空格的路径必须用引号包裹,避免被解析为多个参数。
修正后的代码
# 正确构建MSI属性参数,每个元素为"PROPERTY=VALUE"格式,含空格的路径需用双引号包裹 $msiParams = @( "DataPath=""C:\Program Files (x86)\path""" "Type=Dev" "DbUser=User" "DbPassword=password" "sqlServerUser=user" "sqlServerPassword=password" "QMName=name" "QMAddress=address" "QMPort=1212" "MqUser=user" "MqPassword=password" "SERVER_TYPE=Dev" "RUNTIME_SQL_AUTH_TYPE=WINDOWS_AUTH" "SQL_AUTH_TYPE=WINDOWS_AUTH" "RECYCLING_TIME=03:00" ) $InstallerPath = "$Path.msi" $scriptInstallServer = { # 拼接完整参数列表:安装选项 + 带引号的MSI路径 + 属性参数 $fullArgs = @("/i", "`"$Using:InstallerPath`"", "/qn", "/norestart") + $Using:msiParams # 启动msiexec并等待完成 Start-Process -FilePath "msiexec.exe" -ArgumentList $fullArgs -Wait -Passthru } Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock $scriptInstallServer
关键说明
- 参数数组构建:直接将每个
PROPERTY=VALUE作为数组元素,含空格的路径用嵌套双引号("")包裹,确保远程执行时路径被正确解析。 - ArgumentList使用数组:相比字符串拼接,数组传递参数能避免引号转义混乱的问题,更可靠。
- 变量作用域:通过
$Using:语法正确引用本地变量到远程脚本块中。
内容的提问来源于stack exchange,提问作者kollodziej
相关产品推荐
相关产品推荐

