Powershell:仅为单个命令设置环境variables
在Linux上,我可以这样做:
$ FOO=BAR ./myscript
在设置环境variablesFOO的情况下调用“myscript”。
在Powershell中是否有类似的可能,即不必先设置variables,调用命令,然后再次取消设置variables?
为了更清楚我的使用情况 – 我不想把它作为脚本的一部分。 相反,我有第三方脚本,其行为我可以使用环境variables来控制,但在这种情况下,不是命令行参数。 所以能够在打字之间交替
$ OPTION=1 ./myscript
和
$ ./myscript
只是非常方便。
通常最好通过参数而不是全局variables将信息传递给脚本。 但是,如果这是你需要做的,你想要自动清理variables,那么引入一个新的范围如下所示:
& { $foo = 'bar'; $env:foo = 'bar'; ./myscript }
有几件事要注意这一点。 首先,当范围(scriptblock)退出时,$ foo不再存在。 它只存在于脚本块的上下文中。 但是,环境variables$ env:foo仍然存在,因为这是一个全局变化。 你可以像这样删除这个variables:
Remove-Item Env:\foo
为了达到Unix语法的等价效果,你不仅需要设置环境variables,而且必须在执行该命令之后将其重置为原来的值。 我已经完成了这个常用的命令我使用通过添加类似于以下function到我的PowerShellconfiguration文件。
function cmd_special() { $orig_master=$env:app_master $env:app_master='http://host.example.com' mycmd $args $env:app_master=$orig_master }
所以mycmd
是一些可执行文件,根据环境variablesapp_master
的值而不同。 通过定义cmd_special
,我现在可以使用app_master
环境variablesset …从命令行执行cmd_special
(包括其他参数),并在命令执行后重置(甚至取消设置)。
据推测,你也可以做一个单一的调用特设。
& { $orig_master=$env:appmaster; $env:app_master='http://host.example.com'; mycmd $args; $env:app_master=$orig_master }
它确实应该比这更容易,但显然这不是一个受PowerShell支持的用例。 也许未来版本(或第三方function)将有助于这种使用情况。 如果Powershell有一个可以做到这一点的cmdlet将会很好,例如:
with-env app_master='http://host.example.com' mycmd
也许一个Powershell大师可以build议如何写一个这样的cmdlet。
您可以将variables作用于函数和脚本。
$script:foo = "foo" $foo $function:functionVariable = "v" $functionVariable
如果你想正式使用newvariables声明你的variables,New-Variable也有一个-scope参数。