【问题标题】:Call a Group Object by Name in ForEach Loop在 ForEach 循环中按名称调用组对象
【发布时间】:2016-03-11 20:20:23
【问题描述】:

我已将 CSV 文件导入到数组中,并按电子邮件地址对其进行分组。我希望能够在另一个 ForEach 循环中按名称调用该组,以便我可以向每个电子邮件地址发送一封电子邮件,其中包含与之关联的 $ServerID(s) 和 $DateTime(s) 表。 Group-Object 是开始这个​​的最佳方式吗?

在 CSV 文件中,一个邮箱地址可以关联多台服务器,但一台服务器只能关联一个邮箱地址。文件中的值会不断更新 - 因此几乎所有对象都需要动态变量。

$csv = import-csv "C:Example.csv"

$array = @()

ForEach ($server in $csv) {

        $object = New-Object PSObject -Property @{"Email"= $server.Email; "ServerID" = $server.ServerID; "DateTime" = $server.DateTime}

        $array += $object}

$array | Group-Object Email


Count      Name                                 Group

2       A@gmail.com     {@{PG_Email=A@gmail.com; ServerID=333; Lease_End=10/10/15}, @{PG_Email=A@gmail.com; ServerID=111; Lease_End=12/12/15}}                                                               
1       B@gmail.com     {@{PG_Email=B@gmail.com; ServerID=222; Lease_End=09/09/15}}    

【问题讨论】:

    标签: arrays csv powershell foreach group-by


    【解决方案1】:

    是的,您应该使用Group-Object。我不确定“按名称呼叫组”是什么意思。如果您想根据名称选择一个组,您必须从Group-Object 保存结果并搜索您的组,例如:

    $groups = $array | Group-Object Email
    $selectedmail = "B@gmail.com"
    $groups | Where-Object { $_.Name -eq $selectedmail }
    

    或者您可以将组保存在哈希表中:

    #Create hashtable
    $ht = @{}
    #Fill hashtable with groups (email as key/ID)
    $array | Group-Object Email | ForEach-Object { $ht[$_.Name] = $_.Group }
    
    $selectedmail = "B@gmail.com"
    #Get objects for selected mail
    $ht[$selectedmail]
    

    如果你要给每个人发邮件,我会简化为:

    Import-Csv "C:\Example.csv" |
    Group-Object Email |
    ForEach-Object {
        $to = $_.Name
    
        #Get table of ServerID + Lease_End as string to send as mailbody
        $mailbody = $_.Group | Format-Table -Property ServerID, Lease_End -AutoSize | Out-String
    
        #You could also create a HTML-table with:
        $htmlbody = $_.Group | Select-Object -Property ServerID, Lease_End | ConvertTo-HTML -Property Name, Length
    
        #Send mail
        #Send-MailMessage -To $to -Subject "Lease-status" -Body $mailbody -From "mysupersecret@mail.com"
    }
    

    【讨论】:

    • 谢谢你,Frode 的详细回复。是的,通过“按名称调用组”,我的意思是保存和搜索,如您所料。只要 $selectedemail 可以是动态的,您的第一个解决方案就应该很好用。我会从 CSV 创建一个单独的不同电子邮件地址数组以循环遍历吗?相信我,我希望这封电子邮件可以发送给每个人,但不幸的是,它要求分别发送电子邮件。感谢您的耐心等待 - 我几周前才开始使用 Powershell。
    • 如果您不打算发送给每个人,我不确定为什么需要循环数组(循环通常意味着您没有特定的数组或不知道要发送给谁) .无论如何。您不需要创建另一个数组。您可以使用$groups.Name$ht.keys,具体取决于您用于列出所有电子邮件的解决方案。变量总是动态的(在代码中更改它,用函数参数替换它等),这就是我使用变量的原因,以便代码取决于变量而不是一个特定的地址。 :-)
    • 有道理。谢谢,弗罗德!
    • 没问题。请记住在决定时标记正确答案,以便问题可以“关闭”
    猜你喜欢
    • 2021-01-26
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多