gpt4 book ai didi

powershell - 使用 ScriptBlock 和 ArgumentList 调用时,Invoke-Command 仅返回一个对象

转载 作者:行者123 更新时间:2023-12-02 23:35:49 26 4
gpt4 key购买 nike

当通过 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

谁能向我解释我做错了什么?我不能是唯一一个被这个捕获的人。

最佳答案

-ArgumentList顾名思义,它将参数列表传递给命令。如果可能,该列表中的每个值都分配给定义的参数。但是您只定义了一个参数:$array .因此,您只能从 arg 列表中获取第一个值。

看,这实际上是它应该如何工作的(3 个参数绑定(bind)到 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))

另一种方法(在这个简单的例子中)是使用 automatic $args多变的:
Invoke-Command  -ScriptBlock {
$args | % { $i = $_ ; Get-culture | select @{n = '__id'; e = {$i}}, DisplayName }
} -ArgumentList 1, 2, 3

关于powershell - 使用 ScriptBlock 和 ArgumentList 调用时,Invoke-Command 仅返回一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55281599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com