【问题标题】:Modifying remote variables inside ScriptBlock using Invoke-Command使用 Invoke-Command 修改 ScriptBlock 中的远程变量
【发布时间】:2020-03-18 15:59:13
【问题描述】:

是否可以修改远程变量?我正在尝试执行以下操作:

$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”值写回到本地/调用会话中的变量中吗?
  • 看起来他可能正在远程机器上运行命令,并希望将响应返回到第一台机器变量中。这是正确的吗?
  • 是的,这是正确的,马蒂亚斯。而且要编辑的变量不止一个,这使得从命令中返回单个值变得更加复杂。

标签: powershell powershell-remoting


【解决方案1】:

因此,您尝试做的事情不会奏效。但这里有一个解决方法。

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

$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

【讨论】:

  • 谢谢!直到明天我才有机会尝试这个,但我会继续并将其标记为答案。试用后会更新。
【解决方案2】:

你试图做的事情根本行不通:

$using:调用者范围内的变量的引用在脚本块中执行会话外(例如远程,通过Invoke-Command -ComputerName,就像你的情况一样):

  • 不是变量对象的引用(对变量作为一个整体),

  • 但是扩展到变量的,并且你根本不能将某些东西分配给 .

在手头的情况下,$using:var1 在你的脚本块中实际上变成了""(当Invoke-Command 被调用时$var1),像"" = "Hello world" 这样的东西不能工作。

在撰写本文时,概念性帮助主题 about_Remote_Variables 尚未提及上述内容,而是 update is imminent

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


至于潜在的解决方案

使您的脚本块输出感兴趣的值,然后分配给局部变量,如ArcSet's helpful answer所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2012-09-18
    • 1970-01-01
    • 2016-05-31
    • 2012-01-22
    相关资源
    最近更新 更多