NSIS运行时CMD,路径和参数中带有空格

时间:2018-06-21 09:53:37

标签: cmd whitespace nsis pathname

我有一个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'

1 个答案:

答案 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"'