ForEach-Object -Parallel 如何使用

ForEach-Object -Parallel How to use it

我开始将 ForEach-Object -ParallelPowerShell 7 结合使用。我正在测试以下代码:

$MyArr = @()
$MyArr = (
    ('v1ne','rgNE'),`
    ('v1we','rgWE')
)

$MyArr | ForEach-Object -Parallel  { 
    Start-AzVM -Name $MyArr[0]  -ResourceGroupName $MyArr[1]
} -ThrottleLimit 10

在不同资源组的 Azure 上启动一些虚拟机。我的想法是从数组或 Azure 自动化变量中获取变量。但是我不知道如何在 ForEach-Object -Parallel.

中传递不同的资源组名称

非常感谢任何帮助。

作为 Mathias explained in comments, when using ForEach-Object -Parallel, you would need to use $_ (also known as $PSItem) 从管道 引用 当前对象(同样适用于 ForEach-Object)。如果你想引用一个不是来自管道的变量,你可以使用 $using: keyworkd.

示例:

$notFromPipeline = 'Hello'

0..5 | ForEach-Object -Parallel {
    "$using:notFromPipeline $_"
}

至于如何处理您的脚本,我认为 splatting with $_ 似乎适合这个,假设您有一个带有 VM 名称 及其对应的 资源组 ,例如:

  • VMs.csv
Name,ResourceGroupName
v1ne,rgNE
v1we,rgwE

你可以这样做,注意,下面的例子是使用一个函数(TestSplat)只是为了向你展示如何使用[=31绑定参数=],在您的情况下,您可以将此函数替换为 Start-AzVM

首先,您可以创建一个 哈希表数组 ,如下所示:

$myParams = Import-Csv ./VMs.csv | ForEach-Object {
    $z = @{}
    foreach($prop in $_.PSObject.Properties) {
        $z[$prop.Name] = $prop.Value
    }
    $z
}

$myParams 会是这样的:

Name                           Value
----                           -----
Name                           v1ne
ResourceGroupName              rgNE
Name                           v1we
ResourceGroupName              rgwE

CSV 的列名称 必须与 Start-VM 的参数名称(NameResourceGroupName.

现在您可以使用 ForEach-Object -Parallel:

迭代 $myParams
$myParams | ForEach-Object -Parallel  {
    function TestSplat {
        param($Name, $ResourceGroupName)
        Write-Host "Name: $Name - ResourceGroup: $ResourceGroupName"
    }

    TestSplat @_
} -ThrottleLimit 10

结果应该是:

Name: v1ne - ResourceGroup: rgNE
Name: v1we - ResourceGroup: rgwE