Powershell:仅为单个命令设置环境变量

时间:2009-09-14 10:21:02

标签: windows powershell scripting variables environment

在Linux上,我可以这样做:

$ FOO=BAR ./myscript

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

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

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

$ OPTION=1 ./myscript

$ ./myscript

会非常方便。

8 个答案:

答案 0 :(得分:28)

通常,最好通过参数而不是a来将信息传递给脚本 全局(环境)变量。但如果这是你需要做的,你可以这样做:

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

环境变量$ env:FOO可以在以后删除:

Remove-Item Env:\FOO

答案 1 :(得分:7)

单行完成这两种简单方法:

$env:FOO='BAR'; .\myscript; $env:FOO=''
$env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO

仅汇总其他答案(谢谢大家)中的信息,由于某些原因,这些答案不包含纯粹的一语。

答案 2 :(得分:3)

要完成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,我现在可以从命令行执行cmd_special(包括其他参数)并设置app_master环境变量...并在执行后重置(甚至取消设置)命令。

据推测,您也可以为单次调用进行临时处理。

& { $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。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

您可以通过以Job身份运行脚本来做到这一点:

Start-Job -InitializationScript { $env:FOO = 'BAR' } -FilePath .\myscript.ps1 |
    Receive-Job -Wait -AutoRemoveJob

您还可以使用ArgumentList的{​​{1}}参数将参数传递给脚本:

Start-Job

优点和缺点

  • 脚本完成后,您不必重置环境变量(这需要$jobArgs = @{ InitializationScript = { $env:FOO = 'BAR' } FilePath = '.\myscript.ps1' ArgumentList = 'arg1', 'arg2' } Start-Job @jobArgs | Receive-Job -Wait -AutoRemoveJob / try才能正确执行,即使存在异常也是如此)。
  • 环境变量对于启动的脚本而言实际上是本地的。它不会影响其他可能并行启动的作业。
  • 该脚本将在自己的,有点隔离的环境中运行。这意味着启动的脚本无法设置主脚本的变量,它将不得不使用finally与主脚本进行通讯。根据使用情况,这可能是优点还是缺点。

答案 5 :(得分:0)

考虑到CMD是Windows内核上的本机CLI(并且仍然是许多工具的自动化接口),您可能正在从CMD提示符下使用powershell.exe或接受CMD的接口执行PowerShell脚本控制台语句。

如果您使用-File参数将脚本传递给powershell.exe,则不能使用其他PowerShell代码来设置脚本要访问的环境变量,因此可以设置环境调用powershell.exe之前在CMD环境中的变量:

> set foo=bar && powershell.exe -File .\script.ps1

单个&也将起作用,但是如果set由于某种原因失败,该命令将继续执行。 (这有可能吗?我不知道。)

另外,将"foo=bar"括在引号中可能更安全,以使后面的任何内容都不作为变量内容传递给set

答案 6 :(得分:-1)

https://gist.github.com/bobalob/6632690e33747c13a8c00875ee686be2

Url.Action(
                "ConfirmEmail", "Customer",
                 routeValues: new { userId = user.Id, code },
                 protocol: Request.Url.Scheme );

答案 7 :(得分:-3)

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

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

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