使用Powershell编写中的环境变量,只有1行[重复]

4szc88ey  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(127)

此问题在此处已有答案

PowerShell: Setting an environment variable for a single command only(9个回答)
5年前关闭。
我知道你可以将环境变量传递给docker-compose。
docker-compose.yml

. . .
mysql:
    image: mariadb:10.2
    ports:
     - "${DB_PORT}:3306"
. . .

字符串
第一个月
然而,这只适用于bash。我正在使用PowerShell,并试图找到一个等效的,只有一行命令。
PS> $env:DB_PORT:3306 docker-compose up不工作。多行也不工作

$env:DB_PORT=3396 `
>> docker-compose -up


我得到的错误是Unexpected token 'docker-compose' in expression or statement.
如果我一次做一个,它会起作用...

PS> $env:DB_PORT=3396
PS> docker-compose -up


当bash中的等价物简单得可笑时,在PowerShell中没有办法做到这一点吗?

tzdcorbm

tzdcorbm1#

类似POSIX的shell(如bash)提供了一种以 * 命令范围 * 的方式设置环境变量的方法,只需将<varName>=<value>直接前置到命令中,如下例所示:

$ foo=bar bash -c 'echo "[$foo]"'; echo "[$foo]"
[bar]
[]

字符串
foo=bar仅为bash -c '...' * 子进程 * 定义 * 环境 * 变量foo;next 命令-echo ...-* 看不到 * 此变量。

PowerShell自v7.4起没有等效构造

为了在未来添加支持,至少使用类似的语法,这是一个长期的特性请求的主题,GitHub issue #3316
现在,你能做的最好的事情就是首先 * 在一个 * 单独的语句 * 中,使用;(PowerShell的语句分隔符)定义你感兴趣的环境变量。之后你调用的任何外部实用程序(总是在 * 子进程 * 中运行)都会看到它,但是请注意环境变量在当前PowerShell会话中仍然有效,除非您手动删除它

# Set the env. variable, call the command that should see it,
# remove it afterwards.
PS> $env:foo = 'bar'; bash -c 'echo "[$foo]"'; $env:foo = $null
[bar]


注意$env:foo = $null,也就是说,将环境变量设置为$null与 * 删除 * 它是一样的;或者,您可以将所有Remove-Item env:foo
如果您还想事后恢复一个预先存在的值

$env:foo = 'original'

# Temporarily change $env:foo to a different value, invoke the
# program that should see it, then restore the previous value.
& { $org, $env:foo = $env:foo, 'bar'; bash -c 'echo "[$foo]"'; $env:foo = $org }

$env:foo


以上结果:

[bar]
original


这表明当bash进程看到临时值bar时,$env:foo的原始值随后被恢复。
还要注意另一个重要的区别:

  • 在 * POSIX类shell * 中,environment 变量隐式地显示为 shell 变量-它们共享shell为变量提供的唯一命名空间。
  • 相比之下,PowerShell 仅 * 通过$env:<varName>命名空间(例如,$env:foo)显示环境变量,这与PowerShell自己的变量(例如,$foo)的(无前缀)命名空间不同。

相关问题