Environment variables in Compose using Powershell with only 1 line [duplicate] Environment variables in Compose using Powershell with only 1 line [duplicate] powershell powershell

Environment variables in Compose using Powershell with only 1 line [duplicate]


POSIX-like shells such as bash offer a way to set environment variables in a command-scoped way, simply by prepending <varName>=<value> pairs directly to a command, as the following example demonstrates:

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

foo=bar defines environment variable foo for the bash -c '...' child process only; the next command - echo ... - does not see this variable.


PowerShell has NO equivalent construct.

The best you can do is to define the environment variable of interest first, in a separate statement, using ;, PowerShell's statement separator. Any external utility you invoke thereafter - which invariably runs in a child process - will see it, but note that the environment variable will remain in effect in the current PowerShell session, unless you manually remove it:

# 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]

Note how $env:foo = $null i.e., setting the environment variable to $null is the same as removing it; alternatively, you could all Remove-Item env:foo

If you also want to restore a pre-existing value afterwards:

$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

The above yields:

[bar]original

showing that while the bash process saw the temporary value, bar, the original value of $env:foo was restored afterwards.


Also note another important difference:

  • In POSIX-like shells, environment variables are implicitly surfaced as shell variables - they share the one and only namespace the shell has for variables.

  • By contrast, PowerShell surfaces environment variables only via the $env:<varName> namespace (e.g., $env:foo), which is distinct from the (prefix-less) namespace for PowerShell's own variables (e.g., $foo).