我正在尝试将输入密码传递给NSIS中的sql命令。 如果我在命令行上运行psql,它就像:
psql -U postgres -v V1=username -v V2="'dbpassword'" -w -f "path\file.sql"
sql文件包含以下相关命令:
CREATE USER :V1 WITH PASSWORD :V2 LOGIN NOSUPERUSER IN GROUP postgres;
如何使用变量在NSIS中执行相同的命令?我尝试了以下但是不起作用
nsExec::Exec 'psql -U postgres -v V1=$username -v V2=$dbpassword -w -f "path\file.sql"'
如果我使用"'$dbpassword'"
它就不会编译。
答案 0 :(得分:2)
您有引用问题:当您尝试将-v V2="'$dbpassword'"
放入命令
nsExec::Exec 'psql -U postgres -v V1=$username -v V2=$dbpassword -w -f "path\file.sql"'
导致以下命令,字符串引用不匹配:
nsExec::Exec 'psql -U postgres -v V1=$username -v V2="'$dbpassword'" -w -f "path\file.sql"'
^ ^
`- Begining of string `- End of string
在V2
之后的单引号之后,字符串被语法终止,因此以下文本对于编译器来说是垃圾。
诀窍是NSIS可以处理3个不同的字符串分隔符:单引号'
,双引号"
和反引号`
。
尝试使用反引号来避免命令中的单/双引号冲突:
nsExec::Exec `psql -U postgres -v V1=$username -v V2="'$dbpassword'" -w -f "path\file.sql"`