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

远程机器通过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

关键说明

  1. 参数数组构建:直接将每个PROPERTY=VALUE作为数组元素,含空格的路径用嵌套双引号("")包裹,确保远程执行时路径被正确解析。
  2. ArgumentList使用数组:相比字符串拼接,数组传递参数能避免引号转义混乱的问题,更可靠。
  3. 变量作用域:通过$Using:语法正确引用本地变量到远程脚本块中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:23:11