Попытка смешать данные из CSV и хеш-таблицы, чтобы создать переменную

Я остановился на Code Review и спросил, как мне упростить скрипт, и мне посоветовали использовать хеш-таблицу в качестве это очистит код. Мне дали очень простой пример, но это не было включай и работай. Я разработал базовый код, но он не делает того, что, по моему мнению, должен. Зная, что люди из Code Review не готовы к такой поддержке, вот я и ищу помощь с объединением переменной из CSV и хеш-таблицы. Я оставлю примеры данных из моего CSV и кода Powershell ниже.

Образец CSV:

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:

# 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)] : $_"
        }
    }
}

Моя проблема: сценарий в конечном итоге выдает ошибку из-за того, что для переменной $SchoolCode задано значение null. Я хочу, чтобы сценарий находил номер (код) из поля school в CSV и сопоставлял его с именем, которое в конечном итоге становится OU в AD, где будет создан пользовательский объект. По сути, код пытается создать пользовательский объект в "CN=Tome Smith,OU=2021,OU=Students,OU=,OU=accounts,DC=academic,DC=exeter,DC=k12,DC=pa,DC=us", который показывает, что переменная $SchoolCode либо пуста, либо иным образом не устанавливается правильно.

Как я упоминал в комментарии, мы думаем о добавлении других статических данных в хеш-таблицу в виде (вложенной?) хэш-таблицы. Вот пример того, о чем мы думаем. Со временем список групп AD может увеличиваться.

Пример вложенной хеш-таблицы:

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

Я просматриваю Интернет и пытаюсь лучше понять хеш-таблицы. Если я смогу обдумать это, вложение их будет моим следующим шагом.


person RKillcrazy    schedule 25.10.2017    source источник


Ответы (1)


Если вы не используете данные повторно, не обязательно превращать их в хэш-таблицу. Также ошибка заключается в доступе к значению $SchoolCodes. По какой-то причине метод доступа не работает с [String], но работает при приведении к [Int]

Пример набора данных:

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

Код:

#requires -Version 3
$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)
{
    [String]$LoginName = $User.'Stu Access Login'
    If (-not (Get-ADUser -Filter {SamAccountName -eq $LoginName}))
    {
        $FirstName = $User.'Student First Name'
        $LastName = $User.'Student Last Name'

        $Params = @{
            Name = "$FirstName $LastName"
            SamAccountName = $LoginName
            GivenName = $FirstName
            Initials = $User.I
            Surname = $LastName
            DisplayName = "$FirstName $($User.I) $LastName"
            UserPrincipalName = "[email protected]"
            EmailAddress = "[email protected]"
            AccountPassword = ConvertTo-SecureString -String (
                '{0}{1}{2}#{3}' -f @(
                    $FirstName[0].ToString().ToUpper(),
                    $User.I[0].ToString().ToLower(),
                    $LastName[0].ToString().ToLower(),
                    $User.'Other ID')) -AsPlainText -Force
            Enabled = $False
            PasswordNeverExpires = $True
            CannotChangePassword = $True
            Path = 'OU={0},OU=Students,OU={1},OU=accounts,DC=academic,DC=mydomain,DC=k12,DC=pa,DC=us' -f @(
                $User.'Grad Year',
                $SchoolCodes[[Int]$User.School])
            WhatIf = $True
        }

        Try {New-ADUser @Params}
        Catch {Write-Error "[ERROR] Can't create user [$LoginName] : $_"}
    }
}
person Maximilian Burszley    schedule 25.10.2017
comment
Этот сценарий будет повторно использоваться каждый раз, когда необходимо создать учетную запись AD. В основном, как школьники приходят в район. В конечном счете, я хотел бы добавить больше статических данных в эту хеш-таблицу в виде (возможно) вложенных хеш-таблиц. - person RKillcrazy; 26.10.2017
comment
@RKillcrazy Сценарий, конечно, используется повторно, но хеш-таблицы - нет, и именно здесь они полезны. В любом случае, ошибка в вашем коде заключалась в том, что аксессор $SchoolCodes был строкой, и он хотел, чтобы Int. Попробуйте определить свою хэш-таблицу как '20' = 'schoolname' и посмотрите, решит ли это вашу конкретную проблему. - person Maximilian Burszley; 26.10.2017
comment
Удаление кавычек вокруг школьных кодов немедленно исправило мой код; Спасибо за это! Ваш код, хотя и выглядел более элегантным, чем мой, содержал ошибки: Get-ADUser : Invalid type 'System.Management.Automation.PSCustomObject'. Тем не менее, я хотел бы узнать о вашем коде больше, если это вообще возможно. Во-первых, я вижу, что вы используете {0}{1} (замены?) для аргументов AccountPassword и Path. Как правильно назвать такую ​​штуку? - person RKillcrazy; 26.10.2017
comment
@RKillcrazy Это странно. Поставьте [String] перед $User. Это называется оператором формата, он работает с -f @(array) - person Maximilian Burszley; 26.10.2017
comment
Куда следует [String] идти? Я вижу несколько экземпляров $User в вашем коде, я протестировал его в нескольких из этих мест и все еще вижу ошибки. - person RKillcrazy; 26.10.2017
comment
@RKillcrazy Я изменил свой пример. - person Maximilian Burszley; 26.10.2017
comment
Ваш скорректированный код дает следующую ошибку: Method invocation failed because [System.Char] does not contain a method named 'ToUpper'. - person RKillcrazy; 26.10.2017
comment
@RKillcrazy Странно, что он рассматривает это как [Char]. Добавить .ToString().ToUpper() - person Maximilian Burszley; 26.10.2017
comment
Я изменил параметр AccountPassword, как показано ниже, и ошибки исчезли. AccountPassword = ConvertTo-SecureString -String ('{0}{1}{2}#{3}' -f @($FirstName[0].ToString().ToUpper(),$User.I[0].ToString().ToLower(),$LastName[0].ToString().ToLower(),$User.'Other ID')) -AsPlainText -Force - person RKillcrazy; 26.10.2017