在Linux上,我可以做:
$ FOO=BAR ./myscript
在设置环境变量FOO的情况下调用myscript。
在PowerShell中是否可能出现类似的情况,即无需首先设置变量,调用命令,然后再次取消设置变量?
为了更清楚地说明我的用例——我不想把它用作脚本的一部分。相反,我有一个第三方脚本,我可以使用环境变量控制其行为,但在本例中,不能使用命令行参数。所以能够在打字之间交替
$ OPTION=1 ./myscript
and
$ ./myscript
会很方便的。
要实现与Unix语法相同的功能,您不仅必须设置环境变量,还必须在执行命令后将其重置为以前的值。通过在PowerShell概要文件中添加类似于下面的函数,我已经为我使用的常见命令实现了这一点。
function cmd_special()
{
$orig_master = $env:app_master
$env:app_master = 'http://host.example.com'
mycmd $args
$env:app_master = $orig_master
}
mycmd是一些可执行文件,根据环境变量app_master的值,它的操作方式不同。通过定义cmd_special,我现在可以使用app_master环境变量set…从命令行执行cmd_special(包括其他参数)。在执行命令后,它会被重置(甚至取消设置)。
据推测,您也可以为单个调用执行这种临时操作。
& { $orig_master = $env:appmaster; $env:app_master = 'http://host.example.com'; mycmd $args; $env:app_master = $orig_master }
实际上应该比这个简单,但显然PowerShell并不支持这种用例。也许未来的版本(或第三方功能)将促进这个用例。如果PowerShell有一个cmdlet可以做到这一点,那就太好了,例如:
with-env app_master='http://host.example.com' mycmd
也许PowerShell专家可以建议如何编写这样的cmdlet。
我对这个问题有足够的动力,因此我继续为它编写了一个脚本: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