mir*_*e2k 74 windows variables environment powershell scripting
在Linux上,我可以这样做:
$ FOO=BAR ./myscript
Run Code Online (Sandbox Code Playgroud)
在设置环境变量FOO的情况下调用"myscript".
在Powershell中是否有类似的可能,即无需先设置变量,调用命令,然后再次取消设置变量?
为了更清楚我的用例 - 我不想将它作为脚本的一部分使用.相反,我有一个第三方脚本,其行为我可以使用环境变量控制,但在这种情况下,不是命令行参数.因此能够在打字之间交替
$ OPTION=1 ./myscript
Run Code Online (Sandbox Code Playgroud)
和
$ ./myscript
Run Code Online (Sandbox Code Playgroud)
会非常方便.
gol*_*vok 38
通过使用脚本块调用 powershell 来创建“子 shell”,可以让您确定环境更改的范围:
pwsh -Command { $env:MYVAR="myvalue"; .\path\to.exe }
Run Code Online (Sandbox Code Playgroud)
Kei*_*ill 36
通常,最好通过参数而不是全局(环境)变量将信息传递给脚本.但如果这是你需要做的,你可以这样做:
$env:FOO = 'BAR'; ./myscript
Run Code Online (Sandbox Code Playgroud)
环境变量$ env:FOO可以稍后删除,如下所示:
Remove-Item Env:\FOO
Run Code Online (Sandbox Code Playgroud)
Ale*_*eev 16
在一行中完成的 2 种简单方法:
$env:FOO='BAR'; .\myscript; $env:FOO=''
$env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO
Run Code Online (Sandbox Code Playgroud)
只是总结了其他答案(谢谢大家)中的信息,这些答案由于某种原因不包含纯单行。
Jas*_*mbs 10
要完成与 Unix 语法等效的功能,您不仅需要设置环境变量,而且还必须在执行命令后将其重置为以前的值。我通过向我的 PowerShell 配置文件添加类似于以下内容的函数,为我使用的常用命令完成了此操作。
function cmd_special()
{
$orig_master = $env:app_master
$env:app_master = 'http://host.example.com'
mycmd $args
$env:app_master = $orig_master
}
Run Code Online (Sandbox Code Playgroud)
一些可执行文件也是如此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 }
Run Code Online (Sandbox Code Playgroud)
它确实应该比这更容易,但显然这不是 PowerShell 很容易支持的用例。也许未来的版本(或第三方功能)将促进这个用例。如果 PowerShell 有一个可以执行此操作的 cmdlet,那就太好了,例如:
with-env app_master='http://host.example.com' mycmd
Run Code Online (Sandbox Code Playgroud)
也许 PowerShell 专家可以建议如何编写这样的 cmdlet。
我对这个问题有足够的动力,我继续写了一个脚本: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
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您安装了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
Run Code Online (Sandbox Code Playgroud)
您可以通过将脚本作为Job运行来完成此操作:
Start-Job -InitializationScript { $env:FOO = 'BAR' } -FilePath .\myscript.ps1 |
Receive-Job -Wait -AutoRemoveJob
Run Code Online (Sandbox Code Playgroud)
ArgumentList您还可以使用以下参数将参数传递给脚本Start-Job:
$jobArgs = @{
InitializationScript = { $env:FOO = 'BAR' }
FilePath = '.\myscript.ps1'
ArgumentList = 'arg1', 'arg2'
}
Start-Job @jobArgs | Receive-Job -Wait -AutoRemoveJob
Run Code Online (Sandbox Code Playgroud)
的优点和缺点
try/才能正确执行)。finallyAnd*_*der -7
您可以将变量的范围限定为函数和脚本。
$script:foo = "foo"
$foo
$function:functionVariable = "v"
$functionVariable
Run Code Online (Sandbox Code Playgroud)
如果您想正式地使用 new-variable 声明变量,New-Variable 还有一个 -scope 参数。
| 归档时间: |
|
| 查看次数: |
26964 次 |
| 最近记录: |