在InvokeCommandAND中使用Splat传递与机器相关的参数



我使用的是Invoke命令,但这个问题可能与任何使用splat的命令有关。我主要想传递两组在splat命令中有用的变量,但我不确定如何做到这一点。

在下面的代码中,Invoke命令成功地连接到两个服务器,但我得到的输出是";Server1信息";从两个服务器,这是有道理的,因为代码正在读取它,就像我试图将两个参数传递给两个服务器一样,它正在获取第一个参数中的内容并将其写入主机。不过,我真正希望它每次只传递一个参数,并在连接到连续服务器时向下移动正在传递的参数列表。

$ServerList = "Server1","Server2"
$ServerArgs = "Server1 Info","Server2 Info"
$SB = {
param($Arg1)
Write-Host $Arg1
}
$SplatInfo = @{
ComputerName = $ServerList
ArgumentList = $ServerArgs
}
Invoke-Command @SplatInfo -ScriptBlock $SB

每次调用Invoke-Command只能发送一组参数。

如果你想为每台远程机器传递不同的参数,你需要为每台服务器调用Invoke-Command一次:

$ServerList = "Server1","Server2"
$ServerArgs = "Server1 Info","Server2 Info"
$SB = {
param($Arg1)
Write-Host $Arg1
}
for($i = 0; $i -lt $ServerList.Count; $i++){
$SplatInfo = @{
ComputerName = $ServerList[$i]
ArgumentList = $ServerArgs[$i]
}
Invoke-Command @SplatInfo -ScriptBlock $SB
}

在这种情况下,您可能希望以稍微不同的方式组织输入数据:

$inputList = @(
@{ ComputerName = "Server1"; ArgumentList = @("Server1 Info") }
@{ ComputerName = "Server2"; ArgumentList = @("Server2 Info") }
)
$baseSplat = @{
ScriptBlock = {
param($Arg1)
Write-Host $Arg1
}
}
foreach($entry in $inputList){
Invoke-Command @baseSplat @entry
}

使用哈希表思想。这应该仍然并行运行。

import-csv file.csv | 
% { $ServerArgs = @{} } { $ServerArgs[$_.server] = $_.args }
$ServerList = $ServerArgs | % keys
$SB = {
param($Arg1)
[pscustomobject]@{result = $Arg1[$env:computername]}
}
$SplatInfo = @{
ComputerName = $ServerList
ArgumentList = $ServerArgs
ScriptBlock = $SB
}
Invoke-Command @SplatInfo

result       PSComputerName RunspaceId
------       -------------- ----------
Server1 Info Server1        gacbbb30-2492-41df-b181-9ebf6395b8b6
Server2 Info Server2        ebca4b52-c349-4ff7-972e-e67d07d9c0c3

相关内容

最新更新