2013-05-29 98 views
2

我想通过使用ExecWait在NSIS脚本中运行SQL文件。 我不希望密码对话框弹出,因此我将密码存储在PGPASSWORD环境变量中(有关更多信息:link)。为ExecWait子进程设置环境变量

如果我直接在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' 

其中PasswordText是一个变量(VAR)其中I存储由用户给定的密码。

回答

2

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

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

见的错误处理充分借鉴和榜样关于Setting Environment Variables wiki页面。

+0

哈!它的工作原理,谢谢! (我认为它不适用于多个'ExecWait's,但是它确实)只是出于好奇,我做错了什么? –

+0

不是100%肯定的,但可能是由'&&'链接的命令在从控制台手动调用子进程环境时以及在从“ExecWait”调用子进程环境时不起作用。 – Seki

+0

如何检查运行期间PGPASSWORD的值?我试图nsExec :: ExecToStack ' “$ SYSDIR \ cmd.exe的” 回声%PGPASSWORD%' \t弹出$ 0 \t弹出$ 0 \t的MessageBox MB_OK $ 0,但是这并不工作。 –

2

虽然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'

+0

感谢您的意见。你有关于发布unicode NSIS的时间表的一些信息吗? – Seki

+0

@Seki:最后,不,可能是另一个alpha,然后是beta或者两个。除了在论坛主题中讨论的问题之外,当前的alpha是相当实用的... – Anders