在Linux上,我可以这样做:
$ FOO=BAR ./myscript
在设置环境变量FOO的情况下调用“myscript”。
在Powershell中是否有类似的可能,即无需先设置变量,调用命令,然后再次取消设置变量?
为了更清楚我的用例 - 我不想将它作为脚本的一部分使用。相反,我有一个第三方脚本,其行为我可以使用环境变量控制,但在这种情况下,不是命令行参数。所以能够在输入之间交替
$ OPTION=1 ./myscript
和
$ ./myscript
会非常方便。
答案 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参数。