为 Inno Setup 执行的 Postgres (psql) 进程设置 PGPASSWORD 环境变量

Setting PGPASSWORD environment variable for Postgres (psql) process executed by Inno Setup

我需要使用 Inno Setup 在 Postgres 中创建一个表空间。

我在命令行上有 运行 这个:

SET PGPASSWORD=P0stgres
"C:\Program Files\PostgreSQL.4\bin\psql.exe" -h localhost -p 5432 -U postgres -d postgres -c "CREATE TABLESPACE TABLETEST OWNER postgres LOCATION E'{app}\PATHTEST\Db'"

我在 Inno Setup 中试过这个,但没有成功:

[Run]
Filename: {sys}\cmd.exe; Parameters: "SET PGPASSWORD=P0stgres"
Filename: {sys}\cmd.exe; Parameters: ""C:\Program Files\PostgreSQL.4\bin\psql.exe" -h localhost -p 5432 -U postgres -d postgres -c "CREATE TABLESPACE TABLETEST OWNER postgres LOCATION E'{app}\PATHTEST\Db'""

此致

您遇到三个问题:

  • The cmd.exe needs /C switch 在命令之前。
  • 环境变量并没有神奇地导出到运行 psql.exe 的第二个 cmd.exe 实例。您必须在同一个 cmd.exe 实例中执行这两个命令。其中一种方法是使用 & "operator"(另一种方法是使用包装批处理文件来执行这两个命令)。
  • 双引号(特别是 C:\...\psql.exeCREATE TABLESPACE ... 周围的双引号)have to be doubled.
  • 本身不是问题,但您最好使用 {cmd} constant 而不是 {sys}\cmd.exe
[Run]
Filename: "{cmd}"; Parameters: "/C SET PGPASSWORD=P0stgres& ""C:\Program Files\PostgreSQL.4\bin\psql.exe"" -h localhost -p 5432 -U postgres -d postgres -c ""CREATE TABLESPACE TABLETEST OWNER postgres LOCATION E'{app}\PATHTEST\Db'"""

我能够做到这一点。是一个小错误。 正确的是:

[Run]
Filename: {cmd}; Parameters: "/K SET PGPASSWORD=P0stgres&""C:\Program Files\PostgreSQL.4\bin\psql.exe"" -h localhost -p 5432 -U postgres -d postgres -c ""CREATE TABLESPACE TABLETEST OWNER postgres LOCATION '{app}\PATHTEST\Db'""

我能做到。 password 和 &. PGPASSWORD=password&

之间不应该有 space
Filename: "cmd.exe"; Parameters: "/c set PGPASSWORD=my_db_user& ""psql"" -U my_db_user -d myappdb -a -q -f C:\my\Manager\SQL\Sequences.sql & pause"; Flags: runascurrentuser;