Tentando misturar dados de um CSV e uma hashtable para criar uma variável

Eu parei emRevisão de código, perguntando como eu poderia otimizar um script e fui aconselhado a usar umhashtable como limparia o código. Foi-me dado um exemplo muito básico, mas não foiplug and play. Eu desenvolvi algum código básico, mas ele não está fazendo o que acho que deveria. Conhecendo o pessoal da Revisão de Código, não existe um suporte como este, aqui estou, procurando ajuda para combinar uma variável de um CSV e uma hashtable. Deixarei dados de amostra do meu CSV e do código do Powershell abaixo.

CSV de amostra:

Student First Name,I,Student Last Name,Other ID,Stu Access Login,Student's School Email,School,Grad Year
Johosofat,L,Smith,999999,smithjoh000,[email protected],30,2017
Tome,M,Smith,999998,smithtom000,[email protected],40,2021

Powershell de amostra:

# Testing simple hash table
$SchoolCodes = @{
        20 = "Exeter Township Senior High"
        30 = "Exeter Township Junior High"
        40 = "Lorane Elementary School"
        50 = "Jacksonwald ES"
        70 = "Reiffton School"
        90 = "Owatin Creek Elementary School"
}

# CSV file being imported.
$CsvFile = "$env:USERPROFILE\Downloads\SampleData.csv"

# Import the contents of the CSV file.
$Users = Import-Csv -Path "$CsvFile"

# Loop through each line of the CSV, creating variables for each field.
ForEach ($User in $Users) {
    # Creating the basic variables.
    $FirstName = $User.'Student First Name'
    $MiddleInitial = $User.'I'
    $LastName = $User.'Student Last Name'
    $ADUserName = $User.'Stu Access Login'
    $StudentID = $User.'Other ID'
    $GradYear = $User.'Grad Year'
    $CapFInitial = $FirstName.substring(0,1).ToUpper()
    $MInitial = $MiddleInitial.substring(0,1).ToLower()
    $LInitial = $LastName.substring(0,1).ToLower()
    $Password = "$CapFInitial$MInitial$LInitial" + "#" + "$StudentID"
    $SchoolCode = $SchoolCodes[$User.School]


    If (-Not(Get-ADUser -Filter {SamAccountName -eq $ADUserName})) {
        Try {
            # Create user.
            New-ADUser `
                -Name "$FirstName $LastName" `
                -SamAccountName "$ADUserName" `
                -GivenName "$FirstName" `
                -Initials "$MiddleInitial" `
                -Surname "$LastName" `
                -DisplayName "$FirstName $MiddleInitial. $LastName" `
                -UserPrincipalName "[email protected]" `
                -EmailAddress "[email protected]" `
                -AccountPassword (ConvertTo-SecureString $Password -AsPlainText -Force) `
                -Enabled $false `
                -PasswordNeverExpires $true `
                -CannotChangePassword $true `
                -Path "OU=$GradYear,OU=Students,OU=$SchoolCode,OU=accounts,DC=academic,DC=mydomain,DC=k12,DC=pa,DC=us" `
                -WhatIf
        }

        Catch {
            Write-Error "[ERROR] Can't create user [$($ADUserName)] : $_"
        }
    }
}

Meu problema: Em última análise, o script gera um erro devido ao$SchoolCode variável sendo definida comonulo, Eu acho que. Estou querendo que o script encontre o número (código) doescola no CSV e corresponda ao nome que acaba sendo uma OU no AD - onde o objeto de usuário será criado. Basicamente, o código tenta criar o objeto de usuário no"CN=Tome Smith,OU=2021,OU=Students,OU=,OU=accounts,DC=academic,DC=exeter,DC=k12,DC=pa,DC=us" que mostra o$SchoolCode A variável está em branco ou não está sendo definida corretamente.

Como mencionei em um comentário, estamos pensando em adicionar outros dados estáticos à hashtable como uma hashtable (aninhada?). Aqui está um exemplo do que estamos pensando. Com o passar do tempo, a lista de grupos do AD pode aumentar.

Exemplo doaninhado hashtable:

$SchoolCodes = @{
    20 = @{
        Name = "Exeter Township Senior High"
        ADGroup1 = "Students"
        ADGroup2 = "Secondary Students"
    }
    30 = @{
        Name = "Exeter Township Junior High"
        ADGroup1 = "Students"
        ADGroup2 = "Secondary Students"
    }
    40 = @{
        Name = "Lorane Elementary School"
        ADGroup1 = "Students"
        ADGroup2 = "K4 Students"
    }
    50 = @{
        Name = "Jacksonwald ES"
        ADGroup1 = "Students"
        ADGroup2 = "K4 Students"
    }
    70 = @{
        Name = "Reiffton School"
        ADGroup1 = "Students"
        ADGroup2 = "Secondary Students"
    }
    90 = @{
        Name = "Owatin Creek Elementary School"
        ADGroup1 = "Students"
        ADGroup2 = "K4 Students"
    }
}

Estou vasculhando a web e tentando entender melhor as hashtables. Se eu puder envolver minha cabeça, aninhar-los seria o meu próximo passo.

questionAnswers(1)

yourAnswerToTheQuestion