1

我有一个用 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 `
        > $_
}

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

有没有办法执行脚本块,以便只有变量$_被添加到脚本块的范围内,而没有别的?

4

2 回答 2

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 `
        > $_
}
于 2017-05-03T09:50:09.603 回答
0

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

gv '_'get 是 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 `
        > $_
}
于 2017-05-03T12:38:07.300 回答