【问题标题】:Compare similar values from hashtable with loop in Powershell将哈希表中的相似值与 Powershell 中的循环进行比较
【发布时间】:2019-01-20 08:37:23
【问题描述】:

我有 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

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

你有什么想法吗?谢谢

【问题讨论】:

  • 查看this answer。情况类似,因此您应该能够根据自己的需要调整解决方案。
  • 其实可能和你的问题一样...

标签: arrays powershell compare hashtable


【解决方案1】:

试试这个:

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

注意,我将 $Localisation 散列中的 OU 值与分号 ; 结合起来,以将它们与值本身区分开来。如果这不是您想要的,只需将($result -join '; ') 替换为($result -join ', ')

【讨论】:

  • 感谢您的解释!太棒了!
【解决方案2】:

一种更像 PowerShell 的 IMO 方式,构建一个 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

【讨论】:

  • 我不能使用第一个解决方案:[System.String[] 不包含方法“Trim”。我使用 Powershell 2.0 和第二个(分组)。什么都没发生
猜你喜欢
  • 1970-01-01
  • 2019-02-03
  • 2020-12-03
  • 2011-04-15
  • 1970-01-01
  • 2019-03-26
  • 2019-09-24
  • 2019-03-03
  • 2015-05-13
相关资源
最近更新 更多