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参数。