1

我正在尝试将输入密码传递给 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'"它不会编译。

4

1 回答 1

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"`
于 2013-06-11T13:18:23.270 回答