如何控制 PowerShell 脚本块的范围



>我有一个用PowerShell编写的函数:

function replace([string] $name,[scriptblock] $action) {
Write-Host "Replacing $name"
$_ = $name
$action.Invoke()
}

并将用作:

$name = "tick"
replace $agentPathconfbuildAgent.dist.properties {
(cat templatesbuildAgent.dist.properties.tpl) `
-replace '@@serverurl@@', 'http:/localhost:8080/teamcity' `
-replace '@@name@@', $name `
> $_
}

但是,我发现在脚本块中,变量$namereplace函数中的$name参数覆盖。

有没有办法执行脚本块,以便只将变量$_添加到脚本块的作用域中,而没有其他内容?

我在回答之前声称Powershell仅适用于虐待狂。诀窍在于,如果将函数放入模块中,则局部变量将变为私有变量,并且不会传递给脚本块。然后要传入$_变量,您必须再跳一些箍。

gv '_'获取 powershell 变量$_并通过InvokeWithContext将其传递给上下文。

现在我知道的比我想要的要多:|

New-Module {
function replace([string] $name,[scriptblock] $action) {
Write-Host "Replacing $name"
$_ = $name
$action.InvokeWithContext(@{}, (gv '_'))
}
}

和以前一样

$name = "tick"
replace $agentPathconfbuildAgent.dist.properties {
(cat templatesbuildAgent.dist.properties.tpl) `
-replace '@@serverurl@@', 'http:/localhost:8080/teamcity' `
-replace '@@name@@', $name `
> $_
}

您可以在脚本块中对$name变量使用$global:前缀

$name = "tick"
replace $agentPathconfbuildAgent.dist.properties {
(cat templatesbuildAgent.dist.properties.tpl) `
-replace '@@serverurl@@', 'http:/localhost:8080/teamcity' `
-replace '@@name@@', $global:name `
> $_
}

相关内容

  • 没有找到相关文章

最新更新