将变量传递给启动作业中的 foreach-object -parallel

问题描述 投票:0回答:1

我开发了一个 PowerShell 脚本,用于处理所有 AWS EC2 实例上的健康检查相关内容。该脚本的一部分是打开 EC2 实例的电源并等待 EC2 实例上线。我有多个 AWS 账户和 10000 个 EC2 实例,需要对其运行。 AWS 账户集成了 SSO。

主脚本具有启动作业脚本块,在该块内我有 foreach-object -parallel 块来启动具有特定标签和名称值的实例。我必须将 AWS 配置文件和区域传递给 foreach-object -parallel 才能启动 ec2instances。但低于错误

“ForEach-Object:无法检索 using 变量 '$using:profilename' 的值,因为尚未在本地会话中设置它。”

foreach ($account in $awsaccounts){

 $AWSprofilename = $account.clientname
 $AWSClientRegion = $account.region

$params = @($AWSprofilename, $AWSClientRegion)
$job = Start-Job -Name $AWSprofilename -ScriptBlock {

param($profilename, $awsregion)

$hostnamefilter ="*ABC*","*XYZ*"

$HostnameFilterblock = [scriptblock]::Create( '$_.Hostname -like "' + ($hostnamefilter -join '" -or $_.Hostname -like "') + '"')

$stoppedinstancesreport = (Get-EC2Instance -ProfileName $profilename -Region $awsregion -Filter @{name = 'tag:Filter'; values = 'filtervalue'}).Instances | Where-Object {($_.State.Name -eq "Stopped")} | Select-Object InstanceID, @{N="Hostname";E={($_ | Select-object -ExpandProperty tags | Where-Object -Property Key -eq Name).Value}}, @{N= "State";E={$_.State.Name}}

$FilteredStoppedServers = $stoppedinstancesreport  | Where-Object $HostnameFilterblock

 $FilteredStoppedServers | ForEach-Object -Parallel {
  
   Start-EC2Instance -ProfileName $using:profilename -Region $using:awsregion -InstanceId $_.InstanceId -Confirm:$false
  
     while (((Get-EC2InstanceStatus -InstanceId $_.InstanceId -ProfileName $profilename -Region $awsregion.Status.Status.Value) -ne "OK")
     {
       Write-Host "wating for $($_.Hostname) to come online completely"
       Start-Sleep -Seconds 5
     }
    }
} -ArgumentList $params
} 

我尝试使用 "$using:AWSprofilename ""$using:AWSClientRegion " 传递变量,但仍然遇到相同的错误。

powershell parallel-processing parallel.foreach foreach-object powershell-7.4
1个回答
0
投票

在开始作业之外设置变量对我有用。

$profilename = 'joe'
start-job {
  foreach-object -parallel { $using:profilename }
} | receive-job -wait -auto

joe
© www.soinside.com 2019 - 2024. All rights reserved.