我有一个用PowerShell编写的函数:
function replace([string] $name,[scriptblock] $action) {
Write-Host "Replacing $name"
$_ = $name
$action.Invoke()
}
并将用作:
$name = "tick"
replace $agentPath\conf\buildAgent.dist.properties {
(cat templates\buildAgent.dist.properties.tpl) `
-replace '@@serverurl@@', 'http:/localhost:8080/teamcity' `
-replace '@@name@@', $name `
> $_
}
但是我发现在scriptblock中,变量$name
被$name
函数中的replace
param覆盖。
是否有办法执行脚本块,以便只将变量$_
添加到scriptblock的范围中,但没有其他内容?
答案 0 :(得分:0)
您可以在 scriptblock 中使用$global:
前缀作为$name
变量:
$name = "tick"
replace $agentPath\conf\buildAgent.dist.properties {
(cat templates\buildAgent.dist.properties.tpl) `
-replace '@@serverurl@@', 'http:/localhost:8080/teamcity' `
-replace '@@name@@', $global:name `
> $_
}
答案 1 :(得分:0)
我在答案之前声称powershell仅适用于虐待狂。诀窍在于,如果将函数放入模块中,则局部变量将变为私有,并且不会传递给脚本块。然后传入$_
变量,你必须跳更多的箍。
gv '_'
获取powershell变量$_
并通过InvokeWithContext
将其传递给上下文。
现在我知道的比我想要的更多:|
New-Module {
function replace([string] $name,[scriptblock] $action) {
Write-Host "Replacing $name"
$_ = $name
$action.InvokeWithContext(@{}, (gv '_'))
}
}
和以前一样
$name = "tick"
replace $agentPath\conf\buildAgent.dist.properties {
(cat templates\buildAgent.dist.properties.tpl) `
-replace '@@serverurl@@', 'http:/localhost:8080/teamcity' `
-replace '@@name@@', $name `
> $_
}