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

NSIS Runtime CMD with spaces in path and parameter

我有一个 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 [=10=]
   MessageBox mb_ok "CMDout 0=[=10=]"
   Pop [=10=]
   MessageBox mb_ok "CMD Out 1=[=10=]"

使用上面的方法,变量 $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'

Instdir 是一个变量,不是一个定义,所以你必须使用 $InstDir,而不是 ${InstDir}

CMD.exe 有疯狂的报价处理,有时会删除您的报价,但有一些解决方法:

nsExec::ExecToStack 'CMD.exe /C if 1==1 "c:\path with spaces\app.exe" param1 "par am 2"'