由invoke-command执行的函数中的变量不可见

时间:2018-04-15 21:31:55

标签: function powershell variables scope invoke-command

有人可以帮我解决下面的代码吗?

$ab = "1"
function test {
$script:ab = "c"

}

invoke-command -ComputerName localhost ${function:test}
$ab

通过invoke-command运行上述函数后,我想看到$ ab

的值“c”

1 个答案:

答案 0 :(得分:2)

注意:${function:test}是PowerShell的命名空间符号的一个不常见的实例,相当于
(Get-Item function:test).ScriptBlock;即,它引用函数test body ,作为脚本块

当您使用-ComputerName参数时,Invoke-Command使用远程处理执行指定的脚本块 - 即使目标计算机是相同机器(localhost.)。

远程执行的代码在不同的进程中运行,无法访问调用者的变量。

因此:

  • 如果本地执行是目标,只需省略 -ComputerName参数;然后再次,在这种情况下,您只需运行. ${function:test}甚至只是test

    $ab = "1"
    function test { $script:ab = "c" }
    test  # shorter equivalent of: Invoke-Command ${function:test}
    
  • 对于远程执行输出远程执行的脚本块中所需的新值,并将其分配给调用者范围内的$ab:< / p>

    $ab = "1"
    function test { "c" } # Note: "c" by itself implicitly *outputs* (returns) "c"
    $ab = Invoke-Command -ComputerName localhost ${function:test}