powershell - 使用 Powershell 编写的环境变量仅需 1 行

标签 powershell docker-compose powershell-5.0

我知道你可以将环境变量传递给 docker-compose。

docker-compose.yml

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

$ DB_PORT=3396 docker-compose up

但是这仅适用于 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 中执行此操作?

最佳答案

类似 POSIX 的 shell 例如 bash提供一种命令范围方式设置环境变量的方法,只需在前面添加 <varName>=<value>直接与命令配对,如以下示例所示:

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

foo=bar定义环境变量 foo对于bash -c '...'子进程下一个命令 - echo ... - 没有看到这个变量。

<小时/>

PowerShell 具有没有等效结构

您能做的最好的事情就是首先在单独的语句中定义感兴趣的环境变量,使用 ; ,PowerShell 的语句分隔符。此后您调用的任何外部实用程序(始终在子进程中运行)都会看到它,但请注意,环境变量将在当前 PowerShell session 中保持有效,除非您手动将其删除:

# 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 中,环境 变量隐式地显示为 shell 变量 - 它们共享唯一的命名空间shell 有 for 变量。

  • 相比之下,PowerShell通过 $env:<varName> 显示环境变量命名空间(例如 $env:foo ),与 PowerShell 自身变量的(无前缀)命名空间(例如 $foo )不同。

关于powershell - 使用 Powershell 编写的环境变量仅需 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446092/

相关文章:

powershell - 无法创建输出目录错误: 7zip

mongodb - Docker-Compose:无法连接到 Mongo

powershell - 获取命令 : One command - two usage scenarios - unexpectedly two very different outcomes

powershell - 如何过滤powershell中从控制台程序获取的行?

powershell - $ args [0]不接受完整参数

powershell - IE 浏览器 - Powershell 脚本,用于将站点添加到受信任站点列表、禁用保护模式并降低所有区域的安全级别

function - 如何在调用者的上下文中调用脚本 block ?

node.js - Postgres 不接受使用 docker-compose 的其他容器的任何连接

.net - 无法连接到由 docker compose 启动的 .net 容器

html - 使用 New-Object -ComObject "HTMLFile"解析本地 HTML 文件损坏了吗?