powershell 使用Invoke-Command修改ScriptBlock内的远程变量

lrpiutwd  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(148)

是否可以修改远程变量?我正在尝试做一些类似以下的事情:

$var1 = ""
$var2 = ""

Invoke-Command -ComputerName Server1 -ScriptBlock{
$using:var1 = "Hello World"
$using:var2 = "Goodbye World"
}

当我尝试这样做时,我得到错误:

The assignment expression is not valid.  The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.

显然,使用这种方法是行不通的,但有没有其他我可以采取的方法呢?我需要在远程和本地范围内使用和修改这些变量

vatpfxk5

vatpfxk51#

所以你想做的事不会奏效。但这里有一个变通的办法。
将希望返回的数据放入哈希表中,然后捕获结果并对其进行枚举,然后将值放入变量中。

$var1 = ""
$var2 = ""

$Reponse = Invoke-Command -ComputerName Server1 -ScriptBlock{
    $Stuff1 = "Hey"
    $Stuff2 = "There"
    Return @{
        var1 = $Stuff1
        var2 = $Stuff2
    }
}

$Reponse.GetEnumerator() | %{
    Set-Variable $_.Key -Value $_.Value
}

$var1
$var2

它会回来的

Hey
There
nuypyhwy

nuypyhwy2#

你试图做的事情从根本上说是行不通的:

$using:引用在不同运行空间中执行的脚本块中调用者的作用域中的变量(如远程,通过Invoke-Command -ComputerName,与您的情况一样):

  • 不是对变量对象*的引用(对变量作为一个整体),
  • 但是扩展到变量的,并且您根本不能为赋值。

在手边的例子中,$using:var1实际上变成了脚本块中的""(调用Invoke-Command时,$var1),并且像"" = "Hello world"这样的东西不能工作。
概念性帮助主题about_Remote_Variables(现在)提到(已添加强调):
变量引用(如$using:var)从调用方的上下文扩展为变量$var值。您无法访问调用方的变量对象
有关背景信息,请参见this answer
至于潜在解决方案

让脚本阻塞*输出感兴趣的值**,然后赋给局部变量,如ArcSet's helpful answer所示。

相关问题