使用Invoke-Command在ScriptBlock中修改远程变量

3

能否修改远程变量?我想要做类似以下的事情:

$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.

显然,使用此方法无法实现目标,但是否有其他方法可行?我需要在远程和本地作用域中使用和修改这些变量。


你想将“Hello World”值写回到本地/调用会话中的变量吗? - Mathias R. Jessen
看起来他可能正在远程机器上运行命令,并希望将响应返回到第一台机器的变量中。这正确吗? - ArcSet
是的,没错,Mathias。而且有多个变量正在被编辑,这使得仅从命令返回单个值变得更加复杂。 - William Oettmeier
2个回答

4

你尝试做的不会起作用,但有一个变通方法。

将要返回的数据放入哈希表中,然后捕获结果并枚举它们,将值放入变量中。

$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

3

您试图做的基本上是行不通的:

在不同的运行空间(例如通过Invoke-Command -ComputerName远程执行)中执行的脚本块中,对调用者范围内的变量的$using:引用:

  • 不是对变量对象(整个变量)的引用,

  • 而是扩展为变量的,并且您基本上无法将某些东西分配给

在这种情况下,$using:var1实际上在您的脚本块中变成了""(当调用Invoke-Command$var1的值),并且类似于"" = "Hello world"的操作无法进行。

概念性的帮助主题 about_Remote_Variables(现在)提到(强调添加):

变量引用,例如 $using:var,会扩展为调用方上下文中变量 $var您无法访问调用方的变量对象

有关背景信息,请参见this answer


关于一个可能的解决方案:
让您的脚本块输出感兴趣的值,然后像ArcSet的有用答案所示,将其分配给本地变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接