如何在MSI命令行参数中同时传递空格与双引号?
如何在InstallShield的setup.exe命令行中正确传递含空格和双引号的SERVICEPASSWORD参数
我尝试通过命令行安装InstallShield创建的桌面应用程序安装包setup.exe,直接向MSI传递参数。当前使用的参考命令为:
setup.exe/s /v"/l*V installer.log INSTALLDIR="""C:\Program Files\Diagnostic manager""" INSTANCE=\"SD-WIN8-02\" REPOSITORY=\"Repository1\" SERVICEUSERNAME=\"SD-WIN8-02\testuser\" SERVICEPASSWORD="/7c2'==V@:~U-L%~*.Rv}CvBV'HHzyAq~'5NGA=" CLUSTERINSTALL=0 SETUPTYPE=Typical ApplicationUsers=AllUsers ALLUSERS=1 /qn"
需要支持四种SERVICEPASSWORD场景:
- 无空格无双引号:
/7c2'==V@:~U-L%~*.Rv}CvBV'HHzyAq~'5NGA= - 无空格含双引号:
/7c2'==V@:~U-L%~*.Rv}CvB"V'HHzyAq~'5NGA= - 含空格无双引号:
/7c2'==V@:~U-L%~*.Rv}CvB V'HHzyAq~'5NGA= - 含空格含双引号:
/7c2'==V@:~U-L%~*.Rv}CvB V'H"HzyAq~'5NGA=
前三种场景已找到可行转义方式,但第四种(同时含空格和双引号)的多次尝试均失败,具体失败情况如下:
| 密码(含空格+双引号) | 输入内容 | 失败原因推测 |
|---|---|---|
/7c2'==V@:~U-L%~*.Rv}CvB V'H"HzyAq~'5NGA= | "//7c2'==V@:~U-L%~*.Rv}CvB V'H\"HzyAq~'5NGA=" | 空格未被正确处理 |
/7c2'==V@:~U-L%~*.Rv}CvB V'H"HzyAq~'5NGA= | \"//7c2'==V@:~U-L%~*.Rv}CvB V'H"HzyAq~'5NGA=\" | 双引号未被正确处理 |
/7c2'==V@:~U-L%~*.Rv}CvB V'H"HzyAq~'5NGA= | \"//7c2'==V@:~U-L%~*.Rv}CvB V'H\\\"HzyAq~'5NGA=\" | 双引号未被正确处理 |
/7c2'==V@:~U-L%~*.Rv}CvB V'H"HzyAq~'5NGA= | \"//7c2'==V@:~U-L%~*.Rv}CvB V'H""HzyAq~'5NGA=\" | 双引号未被正确处理 |
通用解决方案
针对InstallShield的setup.exe向MSI传递复杂参数的场景,需遵循以下转义规则:
- 整个密码参数值用三重双引号包裹:
"""密码内容""",因为setup.exe会解析掉最外层一对,MSI再解析掉中间一对,最终剩下的一对会包裹住带空格的密码,确保空格被识别为参数值的一部分。 - 密码内部的双引号替换为连续两个双引号:MSI会将
""解析为单个实际双引号。
第四种场景的正确转义参数
针对含空格和双引号的密码,转义后的SERVICEPASSWORD参数为:
SERVICEPASSWORD="""//7c2'==V@:~U-L%~*.Rv}CvB V'H""HzyAq~'5NGA="""
整合后的完整命令
setup.exe /s /v"/l*V installer.log INSTALLDIR="""C:\Program Files\Diagnostic manager""" INSTANCE=\"SD-WIN8-02\" REPOSITORY=\"Repository1\" SERVICEUSERNAME=\"SD-WIN8-02\testuser\" SERVICEPASSWORD="""//7c2'==V@:~U-L%~*.Rv}CvB V'H""HzyAq~'5NGA=""" CLUSTERINSTALL=0 SETUPTYPE=Typical ApplicationUsers=AllUsers ALLUSERS=1 /qn"
四种场景的通用转义示例
- 场景1(无空格无双引号):
SERVICEPASSWORD="""//7c2'==V@:~U-L%~*.Rv}CvBV'HHzyAq~'5NGA=""" - 场景2(无空格含双引号):
SERVICEPASSWORD="""//7c2'==V@:~U-L%~*.Rv}CvB""V'HHzyAq~'5NGA=""" - 场景3(含空格无双引号):
SERVICEPASSWORD="""//7c2'==V@:~U-L%~*.Rv}CvB V'HHzyAq~'5NGA=""" - 场景4(含空格含双引号):
SERVICEPASSWORD="""//7c2'==V@:~U-L%~*.Rv}CvB V'H""HzyAq~'5NGA="""
内容的提问来源于stack exchange,提问作者Harsh Upparwal
相关产品推荐
相关产品推荐

