2

我正在尝试通过使用在 NSIS 脚本中运行 SQL 文件ExecWait。我不想弹出密码对话框,所以我将密码存储在PGPASSWORD环境变量中(更多信息:链接)。

如果我直接在cmd中执行以下命令,它工作正常:

set PGPASSWORD=PasswordText&&psql -U postgres -w -f "Path\To\File.sql" db_name

但是,当我在 NSIS 脚本中执行相同的命令时,PGPASSWORD没有设置,并且由于密码错误而失败:

ExecWait 'set PGPASSWORD=$PasswordText&&psql -U postgres -w -f "Path\To\File.sql" db_name'

wherePasswordText是一个变量(Var),我在其中存储用户提供的密码。

4

2 回答 2

3

虽然 Seki 的答案适用于 NSIS v2.46,但它不正确并且不适用于 Unicode 目标。你不应该混合t类型和 A/W 函数后缀!

使用 System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PGPASSWORD", "$PasswordText").r0'System::Call 'kernel32::SetEnvironmentVariable(t "PGPASSWORD", t "$PasswordText")i.r0'

于 2013-05-29T20:33:50.363 回答
2

您可以使用系统插件直接从安装程序定义您的环境变量,而不是发送到的命令ExecWait

System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PGPASSWORD", "$PasswordText").r0'
ExecWait 'psql -U postgres -w -f "Path\To\File.sql" db_name'

有关完整参考和错误处理示例,请参阅有关设置环境变量的 wiki 页面。

于 2013-05-29T11:28:26.023 回答