将哈希表中的相似值与Powershell中的循环进行比较

时间:2018-08-13 15:03:11

标签: arrays powershell compare hashtable

我有2个哈希表:

[hashtable]$Localisation = @{
"Macdo" = "OU=France,OU=Paris";
"BurgerKing" = "OU=USA,OU=LA";
"Quick" = "OU=Japan,OU=Tokyo";
}

[hashtable]$Profil = @{
"Big Mac" = "Macdo";
"Whooper" = "BurgerKing";
"Burger" = "Quick, BurgerKing, Macdo";
"Fries" = "BurgerKing, Macdo";
"Coke" = "Quick, Macdo";
"HappyMeal" = "Macdo";
}

我需要得到这样的结果:

"Big Mac" = "OU=France,OU=Paris"
"Whooper" = "OU=USA,OU=LA";
"Burger" = "OU=Japan,OU=Tokyo, OU=USA,OU=LA, OU=France,OU=Paris"
"Fries" = "OU=USA,OU=LA, OU=France,OU=Paris";
"Coke" = "OU=Japan,OU=Tokyo, OU=France,OU=Paris";
"HappyMeal" = "OU=France,OU=Paris";

Big Mac      =  OU=France,OU=Paris
Whooper      =  OU=USA,OU=LA
Burger       =  OU=Japan,OU=Tokyo, 
                OU=USA,OU=LA, 
                OU=France,OU=Paris
Fries        =  OU=USA,OU=LA,
                OU=France,OU=Paris
Coke         =  OU=Japan,OU=Tokyo, 
                OU=France,OU=Paris
HappyMeal    =  OU=France,OU=Paris

我尝试过:

$tempLoca = @()

foreach ($value in $Profil.values) {
    if($Localisation.Contains($value)) {
        $tempLoca = $Localisation.Contains($value),$Profil.key
    }
}

但是我得到了:

$tempLoca 
OU=France,OU=Paris

使用我的代码,我只有最后一个值。我不知道是否需要将值放入数组或哈希表中(因为它们是多个相似的值)。

您有个主意吗?谢谢

2 个答案:

答案 0 :(得分:3)

尝试一下:

[hashtable]$Localisation = @{
"Macdo" = "OU=France,OU=Paris";
"BurgerKing" = "OU=USA,OU=LA";
"Quick" = "OU=Japan,OU=Tokyo";
}

[hashtable]$Profil = @{
"Big Mac" = "Macdo";
"Whooper" = "BurgerKing";
"Burger" = "Quick, BurgerKing, Macdo";
"Fries" = "BurgerKing, Macdo";
"Coke" = "Quick, Macdo";
"HappyMeal" = "Macdo";
}


$tempLoca = @()
foreach ($key in $Profil.Keys) {
    $locals = ($Profil.$key -split ',') | ForEach-Object { $_.Trim() }
    $result = @()
    foreach ($item in $locals) {
        if($Localisation.ContainsKey($item)) {
            $result += $Localisation.$item
        }
    } 
    $tempLoca += '"{0}" = "{1}"' -f $key, ($result -join '; ')
}

$temploca

它将输出

"Big Mac" = "OU=France,OU=Paris"
"HappyMeal" = "OU=France,OU=Paris"
"Burger" = "OU=Japan,OU=Tokyo; OU=USA,OU=LA; OU=France,OU=Paris"
"Whooper" = "OU=USA,OU=LA"
"Fries" = "OU=USA,OU=LA; OU=France,OU=Paris"
"Coke" = "OU=Japan,OU=Tokyo; OU=France,OU=Paris"

注意,我将$ Localization哈希中的OU值与分号;组合在一起,以将它们与值本身区分开。如果那不是您想要的,只需将($result -join '; ')替换为($result -join ', ')

答案 1 :(得分:3)

类似于IMO的PowerShell,构建PSCustomObject并将其分组:

$ProfileLocalisation = ForEach ($key in $Profil.Keys) {
    ForEach ($local in ($Profil.$key -split ',').Trim() ) {
        [PSCustomObject]@{
            Profile = $key
            Localisation = $Localisation.$local
        }
    }
}
$ProfileLocalisation

示例输出:

Profile   Localisation
-------   ------------
Big Mac   OU=France,OU=Paris
HappyMeal OU=France,OU=Paris
Burger    OU=Japan,OU=Tokyo
Burger    OU=USA,OU=LA
Burger    OU=France,OU=Paris
Whooper   OU=USA,OU=LA
Fries     OU=USA,OU=LA
Fries     OU=France,OU=Paris
Coke      OU=Japan,OU=Tokyo
Coke      OU=France,OU=Paris

并分组:

$ProfileLocalisation | Group-Object Profile | ForEach-Object {
    [PSCustomObject]@{
        Profile = $_.Name
        Localisations = ($_.Group.Localisation -join ';')
    }
}

Profile   Localisations
-------   -------------
Big Mac   OU=France,OU=Paris
HappyMeal OU=France,OU=Paris
Burger    OU=Japan,OU=Tokyo;OU=USA,OU=LA;OU=France,OU=Paris
Whooper   OU=USA,OU=LA
Fries     OU=USA,OU=LA;OU=France,OU=Paris
Coke      OU=Japan,OU=Tokyo;OU=France,OU=Paris