ForEach-Object -Parallel 如何使用
ForEach-Object -Parallel How to use it
我开始将 ForEach-Object -Parallel
与 PowerShell 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
的参数名称(Name
和 ResourceGroupName
).
现在您可以使用 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
我开始将 ForEach-Object -Parallel
与 PowerShell 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
的参数名称(Name
和 ResourceGroupName
).
现在您可以使用 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