Compare similar values from hashtable with loop in Powershell

不打扰是莪最后的温柔 提交于 2019-12-08 09:14:37

问题


I have 2 hash tables :

[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";
}

I need to get this kind of result:

"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";

or

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

I tried :

$tempLoca = @()

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

But I get :

$tempLoca 
OU=France,OU=Paris

With my code I have only the last value. I don't know if I need to put my values in array or in hashtable (because they are multiple similar values).

Do you have an idea? Thanks


回答1:


Try this:

[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

It will output

"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"

Note that I combine the OU values from the $Localisation hash with a semicolon ; to distinct them from the values themselves. If that is not what you want, just replace ($result -join '; ') with ($result -join ', ')




回答2:


An IMO more PowerShell like way, building a PSCustomObject and grouping it:

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

Sample output:

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

And grouped:

$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


来源:https://stackoverflow.com/questions/51825301/compare-similar-values-from-hashtable-with-loop-in-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!