Invoke-Command возвращает только один объект при вызове с использованием ScriptBlock и ArgumentList - PullRequest
1 голос
/ 21 марта 2019

Когда код вызывается через Invoke-Command с использованием параметров -ScriptBlock, -ArgumentList и -Computer, из каждого вызова на сервер возвращается только один элемент.

Ниже приведены два примера, освещающих проблему.

$s = New-PSSession -ComputerName Machine01, Machine02

# when called, this block only retuns a single item from the script block
# notice that the array variable is being used
Invoke-Command -Session $s -ScriptBlock {
  param( $array )  
  $array | % { $i = $_ ; Get-culture | select @{name='__id'; ex={$i} } , DisplayName
  }
} -ArgumentList 1,2,3

write-host "`r`n======================================`r`n"

# when called, this block retuns all items from the script block
# notice that the call is the same but instead of using the array variable we use a local array
Invoke-Command -Session $s -ScriptBlock {
  param( $array )  
  1,2,3 | % { $i = $_ ; Get-culture | select @{name='__id'; ex={$i} } , DisplayName
  }
} -ArgumentList 1,2,3

$s | Remove-PSSession

Может кто-нибудь объяснить мне, что я делаю не так? Я не могу быть единственным человеком, пойманным этим.

1 Ответ

0 голосов
/ 21 марта 2019

-ArgumentList делает то, что подразумевает имя, он передает список аргументов команде. Каждое значение из этого списка, если возможно, присваивается определенному параметру. Но у вас есть только один определенный параметр: $array. Поэтому вы получаете только первое значение из списка аргументов.

Видите, на самом деле это так и должно работать (3 аргумента связаны с 3 параметрами):

Invoke-Command -Session $s -ScriptBlock {
    param ($p1, $p2, $p3)  
    $p1, $p2, $p3 | % { $i = $_ ; Get-culture | select @{name='__id'; ex={$i} } , DisplayName }
} -ArgumentList 1, 2, 3

Итак, на самом деле вы хотите передать один массив как один один параметр.

Один из способов сделать это будет:

-ArgumentList (,(1, 2, 3))

Финальный код:

Invoke-Command -Session $s -ScriptBlock {
    param ($array) 
    $array | % { $i = $_ ; Get-culture | select @{n = '__id'; e = {$i}}, DisplayName }
} -ArgumentList (, (1, 2, 3))

Другим способом (в этом простом случае) будет использование автоматической $args переменной:

Invoke-Command  -ScriptBlock {
    $args | % { $i = $_ ; Get-culture | select @{n = '__id'; e = {$i}}, DisplayName }
} -ArgumentList 1, 2, 3
...