【问题标题】:Best way to set environment variable and execute command in one line设置环境变量并在一行中执行命令的最佳方法
【发布时间】:2019-01-08 00:40:38
【问题描述】:

我想使用 PostGreSQL pg_dump 命令进行备份,命令行如下:

"<c:\Program Files\PostgreSQL\9.6\bin\pg_dump>" -h localhost -p 5432 -d test_backup_bat -U user -f D:\destination_backup\test.backup

但我需要先将PGPASSWORD设置为环境变量才能执行备份命令

PGPASSWORD=mypassword

我怎样才能在 Windows CLI 中只使用一个命令行?

【问题讨论】:

  • 1. cmd /V /C set "PGPASSWORD=5432" ^&amp; pg_dump -h localhost -p !PGPASSWORD! -d test_backup_bat -U user -f "D:\destination_backup\test.backup",或 2.set "PGPASSWORD=5432" &amp; call pg_dump -h localhost -p %^PGPASSWORD% -d test_backup_bat -U user -f "D:\destination_backup\test.backup"
  • @aschipfl - 这是否需要提前声明SETLOCAL ENABLEDELAYEDEXPANSION
  • 不,这就是 /V (1.) 或 call (2.) 的用途。无论如何,我想我将5432 误解为您命令行中的密码,这似乎是错误的(对不起,我不知道pg_dump)...

标签: windows postgresql cmd environment-variables command-line-interface


【解决方案1】:

在批处理文件或命令行的同一行中设置变量并在同一行中使用它可能是“棘手的”,因为在设置变量之前会解析完整的行/命令。

但是,在你的情况下,你不需要做任何特别的事情,因为你不需要在命令中使用变量,除了设置它。 pg_dump 只是从它自己的环境块中读取环境变量的内容,该环境块继承自父 cmd 进程。如果父进程定义了变量,那么pg_dump 可以从它自己的副本中读取它。

因此,您只需要在同一行中执行两个命令(一个用于设置变量,一个用于启动新进程),一个接一个地执行。这是通过&amp; 运算符完成的:

set "PGPASSWORD=myPassword" & "c:\Program Files\PostgreSQL\9.6\bin\pg_dump" -h localhost -p 5432 -d test_backup_bat -U user -f D:\destination_backup\test.backup

【讨论】:

  • 我见过set PGPASSWORD=myPassword 的行为与set "PGPASSWORD=myPassword" 不同的情况,请注意引号。知道为什么会这样吗?我似乎找不到关于它的文档
  • @solstice333,引号避免了在使用特殊字符时转义的要求,并在值中包含额外的结束空格。这种类型的引用是使用set 命令来最小化错误的常用方法。当要分配的值中有引号时,您可能会遇到问题(您可以处理它),否则它应该可以工作。
  • 我明白了。但是如果没有使用特殊字符并且不需要尾随空格,那么语义应该是完全相同的吧?为了提供一些背景信息,我看到了 set XPDeprecationWarning=false &amp;&amp; nmake fooset "XPDeprecationWarning=false" &amp;&amp; nmake foo 的不同结果,前者有警告,后者有 no 警告。看起来有点奇怪。
  • @solstice333,set XPDeprecationWarning=false &amp;&amp; nmake foo 行在变量末尾包含一个空格(false&amp;&amp; 之间的空格),而set "XPDeprecationWarning=false" &amp;&amp; nmake foo 不包含空格。
【解决方案2】:

设置:

SET PGPASSWORD=mypasssword

验证:

echo %PGPASSWORD%

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2019-06-30
    • 2015-03-23
    • 2014-02-15
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多