Модификация удаленных переменных внутри ScriptBlock с помощью Invoke-Command - PullRequest
3 голосов
/ 18 марта 2020

Можно ли изменить удаленные переменные? Я пытаюсь сделать что-то вроде следующего:

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

Так что, очевидно, это не работает с помощью этого метода, но Есть ли другие подходы, которые я мог бы предпринять? Мне нужно использовать и изменять эти переменные как в удаленной, так и в локальной области действия

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

То, что вы пытаетесь сделать, принципиально не может работать:

A $using: ссылка на переменную в области вызова области действия в исполняемых блоках сценария вне сеанса (например, удаленно , через Invoke-Command -ComputerName, как в вашем случае):

  • - это , а не a ссылка на объект переменной (на переменную в целом),

  • , но расширяется до значения переменной и вы принципиально не можете присвоить что-либо значению .

В данном случае $using:var1 фактически становится "" в ваш блок скриптов (значение из $var1 при вызове Invoke-Command) и что-то вроде "" = "Hello world" не может работать.

На момент написания этой статьи концептуальная справка topi c about_Remote_Variables пока не упоминает выше, но обновление неизбежно .

См. этот ответ для справочной информации.


Что касается po тенальное решение :

Создайте свой скрипт-блок , выведите интересующие значения, затем присвойте локальные переменные, как показано в Полезный ответ ArcSet .

2 голосов
/ 18 марта 2020

Итак, то, что вы пытаетесь сделать, не работает. Но вот обходной путь.

Поместите данные, которые вы хотите вернуть, в хеш-таблицу, а затем запишите результаты, перечислите их и поместите значение в переменные.

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