【发布时间】:2018-06-21 09:53:36
【问题描述】:
我有一个 Windows .bat 脚本,需要在运行时从 NSIS 安装程序运行。
脚本调用如下:
; Debug Messages to check values set correctly
MessageBox MB_OK "Script ${INSTDIR}\script\settingsLocation.bat"
MessageBox MB_OK "INSTDIR $INSTDIR "
MessageBox MB_OK "SettingsDirType $SettingsDirType"
MessageBox MB_OK "SettingsDirName $SettingsDirName"
MessageBox MB_OK "Calling script ${INSTDIR}\script\settingsLocation.bat $INSTDIR $SettingsDirType $SettingsDirName"
nsExec::ExecToStack 'CMD.exe /C ""${INSTDIR}\script\settingsLocation.bat"" ""${INSTDIR}"" $SettingsDirType $SettingsDirName'
; Check result status and output
Pop $0
MessageBox mb_ok "CMDout 0=$0"
Pop $0
MessageBox mb_ok "CMD Out 1=$0"
使用上面的,变量$INSTDIR没有展开,所以命令找不到脚本也就不足为奇了。
$INSDIR 是 "C:\Program Files (x86)\Prog Name"(三个空格)。
但我使用以下内容(将"" 替换为"):
nsExec::ExecToStack 'CMD.exe /C "${INSTDIR}\script\settingsLocation.bat" "${INSTDIR}" $SettingsDirType $SettingsDirName'
我明白了:
'C:\Program' is not recognized as an internal command, operable program or batch file.
显然,我正处于非扩展和完全扩展忽略引号的 2 个凳子之间。
我怎样才能保留引号,以便命令像手动键入一样运行,如下所示:
"C:\Program Files (x86)\Prog Name\script\settingsLocation.bat" "C:\Program Files (x86)\Prog Name" DTYPE DNAME
更新 1(根据安德斯的回复):
我尝试了以下模组:
nsExec::ExecToStack 'CMD.exe /C "$INSTDIR\script\settingsLocation.bat" "$INSTDIR" $SettingsDirType $SettingsDirName'
即将${INSTDIR}更改为$INSTDIR
这给出了:
'C:\Program' is not recognized as a internal or external command
更新 2
尝试转义内部双引号,如下所示:
nsExec::ExecToStack 'CMD.exe /C \"$INSTDIR\script\settingsLocation.bat\" \"$INSTDIR\" $SettingsDirType $SettingsDirName'
但这给了:
'\"C:\Program Files\....\" is not a recognised as an internal; or external command,
更新 3(已解决!!)
在下面 Anders 的进一步帮助下,添加 if 1==1 位终于让它工作了:
nsExec::ExecToStack 'CMD.exe /C if 1==1 "$INSTDIR\script\settingsLocation.bat" "$INSTDIR" $SettingsDirType $SettingsDirName'
【问题讨论】:
标签: cmd whitespace nsis pathname