Can someone help fix the issue I’m having with the script below? The problem I’m having is some rows have empty cells. For example, not everyone has a cell phone so the cell for that individual is blank. When the script hits a blank cell, it errors out. Also open to any recommended changes overall :slight_smile:

Import-Csv C:\Data.csv | ForEach {
    $manager = (Get-ADUser -Filter "emailAddress -eq '$($_.SUPERVISOR_EMAIL)'").distinguishedName
    Get-ADUser -Filter "emailAddress -eq '$($_.EMAIL)'" |
    set-aduser -employeeID $_.EMPLID -Manager $manager -Title $_.TITLE -Department $_.DEPARTMENT -Replace @{
        ExtensionAttribute1=$_.STATUS
        ExtensionAttribute2=$_.SUPERVISOR_NAME
        ExtensionAttribute3=$_.DEPARTMENT
        telephoneNumber=$_.DESK_PHONE
        homePhone=$_.MAIN_PHONE
        mobile=$_.CELL_PHONE
    }
}
3 Spice ups

change the foreach-object to a proper foreach and then you have to eval each property you want to set if there is a value for it in the CSV object.

Also look into splatting that might help.

Give it a try.

1 Spice up

I think you could also use a try catch on each field. This way if there is no value, it will simply skip that line and continue. Neally will correct me if I’m wrong :slight_smile:

This is untested code that uses the proper foreach Neally mentioned.

$data = Import-Csv C:\Data.csv 
ForEach($d in $data){
    $manager = (Get-ADUser -Filter "emailAddress -eq $d.SUPERVISOR_EMAIL").distinguishedName
    $user = Get-ADUser -Filter "emailAddress -eq $d.EMAIL"
    try{set-aduser $user -employeeID $d.EMPLID}
        catch{write-host "No employeeID found"}
    try{set-aduser $user -Replace @{ExtensionAttribute1=$d.STATUS}}
        catch{write-host "No ExtensionAttribute1 found"}
        AND SO ON...
   }

2 Spice ups

either try

$users=Import-Csv C:\Data.csv
Foreach($User in $Users){
    $manager = (Get-ADUser -Filter "emailAddress -eq '$($user.SUPERVISOR_EMAIL)'").distinguishedName
	$Parameters = @{
		manager     = $manager
        Title       = $user.TITLE
        Department  = $user.DEPARTMENT
        Replace     = @{
        ExtensionAttribute1=$user.STATUS
        ExtensionAttribute2=$user.SUPERVISOR_NAME
        ExtensionAttribute3=$user.DEPARTMENT
        telephoneNumber=$user.DESK_PHONE}
	}
	IF($User.CELL_PHONE -ne $null){$Parameters.add("mobile", $($User.CELL_PHONE))}
	IF($User.MAIN_PHONE -ne $null){$Parameters.add("homePhone", $($User.MAIN_PHONE))}

	 Get-ADUser -Filter "emailAddress -eq '$($user.EMAIL)'" |
        Set-ADUser @Parameters
}

I am not pretty sure about your CSV but above should work, also try

IF($User.CELL_PHONE -like "*"){$Parameters.add("mobile", $($User.CELL_PHONE))}
IF($User.MAIN_PHONE -like "*"){$Parameters.add("homePhone", $($User.MAIN_PHONE))}

or try catch

$users=Import-Csv C:\Data.csv
$ErrorActionPreference='stop'
foreach ($user in $users){
    $manager = (Get-ADUser -Filter "emailAddress -eq '$($user.SUPERVISOR_EMAIL)'").distinguishedName
     $Params = @{
        manager     = $manager
        Title       = $user.TITLE
        Department  = $user.DEPARTMENT
        Replace     = @{
        ExtensionAttribute1=$user.STATUS
        ExtensionAttribute2=$user.SUPERVISOR_NAME
        ExtensionAttribute3=$user.DEPARTMENT
        telephoneNumber=$user.DESK_PHONE
        homePhone  =$user.MAIN_PHONE
        mobile     =$user.CELL_PHONE
            }
        }
        Try{
        Get-ADUser -Filter "emailAddress -eq '$($user.EMAIL)'" |
        Set-ADUser @Params
        }
        Catch{
        Write-Warning $_
        }
    }

1 Spice up

try like so

$csv = Import-Csv "Data.csv"

foreach($row in $csv){
    # get aduser 
    $User    = Get-ADUser -Filter "emailAddress -eq '$($row.email)'"
    # get manager's distinguishedName
    $manager = (Get-ADUser -Filter "emailAddress -eq '$($row.supervisor_email)'").distinguishedName

    # set splat
    $setpr = @{
        identity = $User.SamAccountName
        replace  = @{
            employeeID          = $row.EMPLID
            Manager             = $manager
            Title               = $row.TITLE
            Department          = $row.DEPARTMENT
            ExtensionAttribute1 = $row.STATUS
            ExtensionAttribute2 = $row.SUPERVISOR_NAME
            ExtensionAttribute3 = $row.DEPARTMENT
            telephoneNumber     = $row.DESK_PHONE
            homePhone           = $row.MAIN_PHONE
            mobile              = $row.CELL_PHONE
        }     
    }

    # remove blank attributes
    ($setpr.replace.GetEnumerator() | 
    where-object { -not $_.Value }) |
    foreach-object { $setpr.replace.Remove($_.Name) }

    # set values
    try{
        set-aduser @setpr -ErrorAction Stop -Verbose
    }
    catch{
        $error[0]
    }

}
2 Spice ups

IF($User.CELL_PHONE -ne $null){$Parameters.add(“mobile”, $($User.CELL_PHONE))}
IF($User.MAIN_PHONE -ne $null){$Parameters.add(“homePhone”, $($User.MAIN_PHONE))}

comparing to $Null, $null should be on the left

2 Spice ups