windows win10打印环境变量 Powershell:仅为单个命令设置环境变量



win10环境变量命令行 (4)

我对这个问题充满了动力,我继续为它写了一个脚本: 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

在Linux上,我可以这样做:

$ FOO=BAR ./myscript

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

在Powershell中是否有类似的可能,即无需先设置变量,调用命令,然后再次取消设置变量?

为了更清楚我的用例 - 我不想将它作为脚本的一部分使用。 相反,我有一个第三方脚本,我可以使用环境变量控制其行为,但在这种情况下,不是命令行参数。 因此能够在打字之间交替

$ OPTION=1 ./myscript

$ ./myscript

会非常方便。


Answer #1

要完成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的值进行不同的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。


Answer #2

通常,最好通过参数而不是全局变量将信息传递给脚本。 但是,如果这是你需要做的,你想要自动清理变量,那么引入一个新的范围,如下所示:

& { $foo = 'bar'; $env:foo = 'bar'; ./myscript }

关于这一点需要注意几点。 首先,当退出范围(scriptblock)时,$ foo不再存在。 它仅存在于scriptblock的上下文中。 但是环境变量$ env:foo仍然存在,因为它确实是一个全局变化。 您可以删除该变量,如下所示:

Remove-Item Env:\foo

Answer #3

您可以将变量范围限定为函数和脚本。

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

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





environment