我有一个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.
很明显,我在忽略引号的情况下介于两种非扩展和全扩展之间。
如何保留引号,以使该命令像按如下所示手动键入命令一样运行:
"C:\Program Files (x86)\Prog Name\script\settingsLocation.bat" "C:\Program Files (x86)\Prog Name" DTYPE DNAME
更新1(以下是Anders的回复):
我尝试了以下mod:
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'
答案 0 :(得分:1)
Instdir是变量,而不是定义,因此必须使用$InstDir
,而不是${InstDir}
。
CMD.exe具有疯狂的报价处理功能,有时会删除您的报价,但是有一些解决方法:
nsExec::ExecToStack 'CMD.exe /C if 1==1 "c:\path with spaces\app.exe" param1 "par am 2"'