Я остановился на 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"
}
}
Я просматриваю Интернет и пытаюсь лучше понять хеш-таблицы. Если я смогу обдумать это, вложение их будет моим следующим шагом.