在Linux上,我可以做:

$ FOO=BAR ./myscript

在设置环境变量FOO的情况下调用myscript。

在PowerShell中是否可能出现类似的情况,即无需首先设置变量,调用命令,然后再次取消设置变量?

为了更清楚地说明我的用例——我不想把它用作脚本的一部分。相反,我有一个第三方脚本,我可以使用环境变量控制其行为,但在本例中,不能使用命令行参数。所以能够在打字之间交替

$ OPTION=1 ./myscript

and

$ ./myscript

会很方便的。


当前回答

我对这个问题有足够的动力,因此我继续为它编写了一个脚本:with-env.ps1

用法:

with-env.ps1 FOO=foo BAR=bar your command here

# Supports dot-env files as well
with-env.ps1 .\.env OTHER_ENV=env command here

另一方面,如果你安装了Gow,你可以使用env.exe,它可能比我上面写的快速脚本更健壮一些。

用法:

env.exe FOO=foo BAR=bar your command here

# To use it with dot-env files
env.exe $(cat .env | grep.exe -v '^#') SOME_OTHER_ENV=val your command

其他回答

可以将变量作用于函数和脚本。

$script:foo = "foo"
$foo
$function:functionVariable = "v"
$functionVariable

New-Variable也有一个-scope参数,如果你想要正式并使用New-Variable声明你的变量。

在我的用例中,我需要设置一个环境变量,这样我就可以在Docker撰写脚本中使用它。在我的Powershell脚本中,我使用分号定义变量,然后在同一行上调用docker-compose

$env:PLATFORM="linux/x86_64" ; docker-compose up -d --build

在docker compose中,我现在可以使用我的${PLATFORM}变量。

就像这样

...
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    platform: ${PLATFORM}
...

一个工具使用了一些我无法用pip获取的库。为了将路径保存在一个可记忆的位置,我在全局中设置了$env:PYTHONPATHWAIT。

使用结果是这样的

$env:PYTHONPATH=$env:PYTHONPATHWAIT ; usdcat .\milkyway.usd

我对这个问题有足够的动力,因此我继续为它编写了一个脚本:with-env.ps1

用法:

with-env.ps1 FOO=foo BAR=bar your command here

# Supports dot-env files as well
with-env.ps1 .\.env OTHER_ENV=env command here

另一方面,如果你安装了Gow,你可以使用env.exe,它可能比我上面写的快速脚本更健壮一些。

用法:

env.exe FOO=foo BAR=bar your command here

# To use it with dot-env files
env.exe $(cat .env | grep.exe -v '^#') SOME_OTHER_ENV=val your command

一般来说,通过参数传递信息给脚本比通过参数传递信息更好 全局(环境)变量。但如果这是你需要做的,你可以这样做:

$env:FOO = 'BAR'; ./myscript

环境变量$env:FOO可以稍后删除,如下所示:

Remove-Item Env:\FOO