Tengo una pregunta porque no puedo usar Variable como valores en la tabla hash en PowerShell.

Tengo dos variables

  1. Para obtener el UserPrincipalName de AD y agregarlo a $alias

    $alias = (Get-ADUser -Server "Add Server" -filter * -SearchBase "Add OU").userprincipalname
    
  2. Luego, con $alias, necesito obtener la cuota del buzón con Get-Mailbox y Get-MailboxStatistics en MB y hacer un porcentaje

    $mailbox = foreach ($user in $alias) {
        ($user | Get-MailboxStatistics |
            Select-Object @{name="TotalItemSize (MB)"; expression={
                [Math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
            }})."TotalItemSize (MB)"
    }
    
    • Con este cuota (100 GB en MB)

        $ maxquota = 102400 
    • Para obtener el%

        $ totalsize = foreach ($ size en $ buzón) { (($ tamaño * 100) / $ maxquota) } 

    Ejemplo de tamaño de buzón

    PS> $totalsize
    2.43220703125
    14.3363671875
    8.875205078125
    5.032177734375
    15.548349609375
    0.0112109375
    
  3. Entonces quiero hacer una tabla hash con $alias y $totalsize

    $test = foreach ($name in $alias) {
        foreach($total in $totalsize){}
        @{$name = $total}
    }
    
  4. El resultado debe ser

    Clave: nombre en $alias
    Valor: porcentaje en $total

    Por ejemplo:

    David  - 4.50
    Juan   - 15.00
    Moises - 50
    

Pero cuando pruebo la tabla hash, solo recibo cada nombre con todos los valores o todos los nombres solo con el primer valor

¿Cómo puedo obtener todos los valores como una tabla?

0
jjquintero245 16 oct. 2018 a las 19:14

2 respuestas

La mejor respuesta

El código del paso 3 no crearía una tabla hash, sino una matriz de tablas hash. Además, no sabría qué tamaño de buzón pertenece a qué usuario, porque esa información se pierde después del paso 2.

Algo como esto debería hacer lo que quieras:

$test = @{}   # create new empty hashtable

foreach ($user in $alias) {
    $size = Get-MailboxStatistics -Identity $user |
            Select-Object @{n='TotalItemSize (MB)';e={...}} |
            Select-Object -Expand 'TotalItemSize (MB)'

    $test[$user] = ($size * 100) / $maxquota
}
2
Ansgar Wiechers 16 oct. 2018 a las 22:13

Estás configurando $Test como una matriz de tablas hash. Asigne su $Hashtable y luego agregue valores con el método Add:

Param (
    $maxquota = 102400
)

$HashTable = @{}

$alias = (Get-ADUser -Server "Add Server" -filter * -SearchBase "Add OU").userprincipalname
$mailbox = Foreach ($user in $alias) {($user | Get-MailboxStatistics |  Select-Object @{name="TotalItemSize (MB)"; expression={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}})."TotalItemSize (MB)"}
$totalsize = foreach ($size in $mailbox) { 
    (($size * 100) / $maxquota)
}

$test = Foreach($name in $alias){
    $HashTable.Add($Name,$totalsize)
}
3
Shawn Esterman 17 oct. 2018 a las 13:40