路径和参数中带有空格的 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"'
我有一个 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"'