【问题标题】:Compare same value in CSV in powershell在PowerShell中比较CSV中的相同值
【发布时间】:2014-11-11 17:04:36
【问题描述】:

首先,这就是我的 csv 的样子

ip,Component,User,Pwd,type
172.22.0.67,desktopstudio,Administrator,Activlan2015,xendesktop
10.10.10.0,controller,Administrator,Activlan2015,xendesktop
172.22.0.67,storefront,Administrator,Activlan2015,xendesktop
10.10.10.0,desktopdirector,Administrator,Activlan2015,xendesktop
172.22.0.2,licenseserver,Administrator,Activlan2015,xenapp

这是我的脚本:

$Csv = "C:\springfield\Citrix\CitrixComposants.csv"
$data = Import-Csv $Csv

Foreach ($Server in $Data)
{
Import-module C:\springfield\Citrix\CitrixDeploymentActivlanModule.ps1
Deploy-Citrix -component $Server.component -ip $Server.ip -username $Server.user -pwd $Server.Pwd -type $Server.type
}

当我执行这段代码时,这是函数获取参数的方式:

Deploy-Citrix -component desktopstudio -ip 172.22.0.67 ......
Deploy-Citrix -component controller -ip 10.10.10.0 ......
Deploy-Citrix -component storefront -ip 172.22.0.67 ......
Deploy-Citrix -component desktopdirector -ip 10.10.10.0 ......
Deploy-Citrix -component licenseserver -ip 172.22.0.2 ......

当ip相同时,我想组合“组件”值。

在这个 CSV 中,我们有三个唯一的 ip 172.22.0.67、10.10.10.0 和 172.22.0.2,我想为每个唯一的 IP 组合“组件”值,只执行我的 Foreach 循环 3 次:

Deploy-Citrix -component desktopstudio,storefront -ip 172.22.0.67 ......
Deploy-Citrix -component controller,desktopdirector -ip 10.10.10.0 ......
Deploy-Citrix -component licenseserver -ip 172.22.0.2 ......

我的函数已经可以使用字符串数组了:

Function Deploy-Citrix {
[cmdletBinding(SupportsShouldProcess=$True)]
Param(
 [Parameter(Mandatory=$true)]
 [ValidateNotNullOrEmpty()]
        [string[]]$component,
 ....
        )

我该怎么做?

谢谢

【问题讨论】:

    标签: powershell csv foreach powershell-3.0


    【解决方案1】:

    您熟悉到 Group 的管道吗?

    $Data | Group IP
    

    这将按 IP 属性对事物进行分组,并且应该返回:

    Count Name                      Group                                                               
    ----- ----                      -----                                                               
        2 172.22.0.67               {@{ip=172.22.0.67; Component=desktopstudio; User=Administrator; P...
        2 10.10.10.0                {@{ip=10.10.10.0; Component=controller; User=Administrator; Pwd=A...
        1 172.22.0.2                {@{ip=172.22.0.2; Component=licenseserver; User=Administrator; Pw...
    

    那里的 Group 属性将为 $data 中与该组的 IP 值匹配的每条记录提供一条记录。因此,让我们将其通过管道传输到 ForEach 中,并且只是为了 s***s 和咯咯笑,我们将对该组记录的组件值执行 -join 操作:

    $data | group ip | ForEach{$_.group.component -join ","}
    desktopstudio,storefront
    controller,desktopdirector
    licenseserver
    

    嗯,看起来像你想要做的。好的,很酷,那么我们如何将其用于您的目的?

    Foreach($Grouping in ($data|group ip)){
        $group = $Grouping.group
        $comps = $group.component -join ","
        Deploy-Citrix -component $comps -ip $group[0].ip -username $group[0].user -pwd $group[0].Pwd -type $group[0].type
    }
    

    【讨论】:

    • 我不熟悉到 Group 的管道,但它太棒了!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多