繁体   English   中英

PowerShell。 增加 ForEach-Object -Parallel 中的计数

[英]PowerShell. Increase Count in ForEach-Object -Parallel

我想使用 ForEach-Object -Parallel 将 Azure Web 应用程序的 IP 列入白名单。 这通常是这样完成的:

Add-AzWebAppAccessRestrictionRule -ResourceGroupName "ResourceGroup1" -WebAppName "WebApp1" -Name "IP-100" -Priority "100" -Action Allow -IpAddress "10.0.0.0/24"

我想到的方法,随着计数的变化,例如将 IP-100 更改为 IP-101,优先级从 100 到 101 不起作用,因为ForEach-Object -Parallel正在使用隔离的运行空间

每个运行空间必须加载所需的任何模块,并从调用脚本显式传入任何变量。 唯一自动出现在并行脚本块中的变量是 object 中的管道。

我怎样才能并行运行这样的脚本,像这样?

$Count = 100
Get-Content UniqueIPs.txt | ForEach-Object -Parallel {
    Add-AzWebAppAccessRestrictionRule -ResourceGroupName "ResourceGroup1" -WebAppName "WepApp1" -Name "IP-$using:Count" -Priority "$using:Count" -Action Allow -IpAddress "$IP/24" -WhatIf
    $Count ++
} -ThrottleLimit 5

没有 -Parallel 我通常这样做:

foreach($IP in $IPs1)
{
  Add-AzWebAppAccessRestrictionRule -ResourceGroupName "ResourceGroup1" -WebAppName "WebApp1" -Name "IP-$name" -Priority "$priority" -Action Allow -IpAddress "$IP/24"
  $name ++
  $priority ++
}

一个简单的方法是在将每个 IP 传递给并行ForEach循环之前为其分配一个优先级:

$priority = 100
$IPs = '10.0.0.1','10.0.0.2','10.0.0.3'
$list = foreach ($IP in $IPs) { 
    $IP|select @{l='IP';e={$_}},@{l='Priority';e={$priority}}
    $priority++
}

# $list Outputs:
IP       Priority
--       --------
10.0.0.1      100
10.0.0.2      101
10.0.0.3      102

然后你只需运行你已经拥有的:

$list | ForEach-Object -Parallel {
    Add-AzWebAppAccessRestrictionRule -ResourceGroupName "ResourceGroup1" -WebAppName "WepApp1" -Name "IP-$($_.Priority)" -Priority $_.Priority -Action Allow -IpAddress "$($_.IP)/24" -WhatIf
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM