169

在 Linux 上,我可以这样做:

$ FOO=BAR ./myscript

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

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

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

$ OPTION=1 ./myscript

$ ./myscript

会非常方便。

4

8 回答 8

96

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

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

环境变量 $env:FOO 可以稍后删除,如下所示:

Remove-Item Env:\FOO
于 2009-09-14T14:56:05.743 回答
23

我对这个问题有足够的动力,所以我继续为它写了一个脚本: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
于 2018-01-23T03:06:03.590 回答
22

2 种简单的方法在一行中完成:

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

只是从其他答案(谢谢大家)中总结了一些信息,这些答案由于某种原因不包含纯单行词。

于 2020-06-28T19:19:45.667 回答
6

要完成与 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。

于 2011-01-20T15:55:06.557 回答
4

您可以通过将脚本作为Job运行来做到这一点:

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

ArgumentList您还可以使用以下参数将参数传递给脚本Start-Job

$jobArgs = @{
    InitializationScript = { $env:FOO = 'BAR' } 
    FilePath             = '.\myscript.ps1'
    ArgumentList         = 'arg1', 'arg2' 
}
Start-Job @jobArgs | Receive-Job -Wait -AutoRemoveJob

的优点和缺点

  • 您不必在脚本完成后重置环境变量(即使存在异常也需要try/finally才能正确执行)。
  • 环境变量将是启动脚本的真正本地变量。它不会影响其他可能并行启动的作业。
  • 该脚本将在其自己的、有些孤立的环境中运行。这意味着启动的脚本不能设置主脚本的变量,它必须用来Write-Output与主脚本通信。这可能是优点或缺点,具体取决于用例。
于 2020-11-23T17:45:24.567 回答
4

通过使用脚本块调用 powershell 来创建“子shell”,您可以将更改范围限定为环境:

pwsh -Command { $env:MYVAR="myvalue"; .\path\to.exe }
于 2021-10-28T16:59:48.657 回答
1

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

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

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

单个也可以,但如果由于某种原因失败&,将允许命令继续。set(这甚至可能吗?我不知道。)

此外,用引号括起来可能更安全,这样后面的任何内容都不会作为变量内容"foo=bar"传递。set

于 2018-11-15T03:49:18.547 回答
-6

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

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

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

于 2009-09-14T14:41:35.087 回答