You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Invoke-Command中使用Splat并传递与机器匹配的参数

解决Invoke-Command中服务器与参数一一对应的问题

你的代码中,Invoke-Command会将ArgumentList的整个数组传递给每台服务器,而脚本块仅取第一个参数$Arg1,因此所有服务器都输出Server1 Info。要实现服务器与参数依次匹配对应,需要将服务器和对应的参数绑定后再执行,以下是几种可行方案:

方案一:使用for循环逐个配对执行

通过索引遍历服务器和参数列表,每次给单台服务器传递对应参数:

$ServerList = "Server1","Server2"
$ServerArgs = "Server1 Info","Server2 Info"

$SB = {
    param($Arg1)
    Write-Host $Arg1
}

# 检查列表数量是否一致
if ($ServerList.Count -ne $ServerArgs.Count) {
    Write-Error "服务器列表与参数列表数量不匹配"
    return
}

for ($i = 0; $i -lt $ServerList.Count; $i++) {
    $SplatInfo = @{
        ComputerName = $ServerList[$i]
        ArgumentList = $ServerArgs[$i]
        ScriptBlock  = $SB
    }
    Invoke-Command @SplatInfo
}

方案二:用ForEach-Object结合索引处理

利用索引数组遍历,更符合PowerShell的管道风格:

$ServerList = "Server1","Server2"
$ServerArgs = "Server1 Info","Server2 Info"

$SB = {
    param($Arg1)
    Write-Host $Arg1
}

if ($ServerList.Count -ne $ServerArgs.Count) {
    Write-Error "服务器列表与参数列表数量不匹配"
    return
}

0..($ServerList.Count - 1) | ForEach-Object {
    Invoke-Command -ComputerName $ServerList[$_] -ArgumentList $ServerArgs[$_] -ScriptBlock $SB
}

方案三:创建配对对象后批量处理

先将服务器和参数打包成自定义对象,再统一执行:

$ServerList = "Server1","Server2"
$ServerArgs = "Server1 Info","Server2 Info"

if ($ServerList.Count -ne $ServerArgs.Count) {
    Write-Error "服务器列表与参数列表数量不匹配"
    return
}

# 生成服务器-参数配对对象
$serverArgPairs = for ($i = 0; $i -lt $ServerList.Count; $i++) {
    [PSCustomObject]@{
        Server = $ServerList[$i]
        Arg    = $ServerArgs[$i]
    }
}

$SB = {
    param($Arg1)
    Write-Host $Arg1
}

$serverArgPairs | ForEach-Object {
    Invoke-Command -ComputerName $_.Server -ArgumentList $_.Arg -ScriptBlock $SB
}

注意事项

  • 必须确保$ServerList和$ServerArgs的元素数量完全一致,否则会出现索引越界或参数不匹配的问题,建议添加数量检查逻辑。
  • 以上方案同样适用于其他需要参数与目标对象一一对应的splat场景。

内容的提问来源于stack exchange,提问作者Krenztor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:27:16