PowerShell 5.1含空格路径插值问题:WiX生成EXE安装失败求助
问题:WiX生成的EXE安装程序在PowerShell 5.1中INSTALLDIR路径含空格时失效
在未安装额外脚本环境的Windows 10/11虚拟机中,仅能使用预装的PowerShell 5.1.26100.3624运行WiX生成的EXE安装程序。执行以下代码时安装失败:
$installDir = "$env:ProgramFiles\$appPath" & ".\$setupName" /norestart /log "$setupName.log" /msicl INSTALLDIR="$installDir"
安装程序启动失败,日志文件中显示:
PROPERTY CHANGE: Adding INSTALLDIR property. Its value is 'C:\Program'.
显然是路径中Program Files的空格导致参数被截断。尝试了多种引号转义写法:
& ".\$setupName" /norestart /log "$setupName.log" /msicl INSTALLDIR=""""$installDir"""" & ".\$setupName" /norestart /log "$setupName.log" /msicl INSTALLDIR="\""$installDir"\"" & ".\$setupName" /norestart /log "$setupName.log" /msicl INSTALLDIR="""""""$installDir"""""""
第一种写法仍然失败,后两种无任何响应。使用停止解析标记--%能生效,但会禁用变量插值,无法动态指定路径。
解决方案
1. 单引号包裹路径值,外层加双引号
PowerShell 5.1中,外部程序会正确识别单引号包裹的带空格路径。写法如下:
& ".\$setupName" /norestart /log "$setupName.log" /msicl "INSTALLDIR='$installDir'"
传递给安装程序的参数为INSTALLDIR='C:\Program Files\XXX',WiX生成的EXE能完整读取路径。
2. 借助临时环境变量传值
先将路径存入临时环境变量,再用cmd风格的变量引用传递:
$env:INSTALLDIR_TEMP = $installDir & ".\$setupName" /norestart /log "$setupName.log" /msicl INSTALLDIR="%INSTALLDIR_TEMP%" Remove-Item Env:\INSTALLDIR_TEMP
外部程序会直接读取环境变量值,避免空格导致的参数拆分问题。
3. 使用参数数组传递(最可靠)
PowerShell调用外部程序时,参数数组能确保每个参数被正确传递,无需复杂转义:
$arguments = @( '/norestart', '/log', "$setupName.log", '/msicl', "INSTALLDIR=`"$installDir`"" ) & ".\$setupName" $arguments
用反引号转义双引号,数组会将INSTALLDIR="C:\Program Files\XXX"`作为单个参数传递,彻底解决空格截断问题。
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

