使用 if else 语句在 Foreach 循环中根据从 CSV 获取的值设置变量

Setting variables based on value taken from CSV within a Foreach loop using an if else statement

我创建了一个脚本,从 CSV 文件中获取新用户数据并连接到 AzureAd 和 ExchangeOnline 以创建他们的 AzureAD 帐户,为他们分配 Office 许可证(未显示),并更新他们的邮箱 Office 字段。

CSV headers 是姓名、部门、​​办公地点。 CSV 用于包含域和公司 header。我删除了那些 header 并添加了一个 if elseif 语句来提供在脚本中设置这些变量的逻辑。在此添加之前,脚本运行没有任何问题。

现在,即使 OfficeLocation 值为 San Francisco 或 Austin,这些值应该是 West/South Acme 和 west/south.acme.com.

为什么我的 $company$domain 值在遍历 CSV 时没有在 ForEach-Object 循环中更新?我确认 $company$domain 在不使用 ForEach-Object:

读取 CSV 数据时正确更新
$new_users = Import-Csv -Path .\new-users.csv

...

$main_offices = 'New York','Los Angeles','Houston','Atlanta','Chicago'
$corporate_offices = 'Corporate Office (NY)','Corporate Office (LA)'
$west_office = 'San Francisco'
$south_office = 'Austin'

$new_users | ForEach-Object {
    $first, $last = $_.Name.Split()
    $mailnickname = $(($first.Substring(0,1) + $last).ToLower())
    $password_profile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
    $password_profile.Password = 'XXXXXXXXXXXXXXXXXX'
    $password_profile.ForceChangePasswordNextLogin = $false
    $off_loc = $_.OfficeLocation

    if ($off_loc -in $main_offices -or $corporate_offices) {
        $company = 'Contoso'
        $domain = '@contoso.com'
    } elseif ($off_loc -eq $west_office) {
        $company = 'West Acme'
        $domain = '@west.acme.com'
    } elseif ($off_loc -eq $south_office) {
        $company = 'South Acme'
        $domain = '@south.acme.com'
    } else { $off_loc = Read-Host 'Type an office location' } #CSV OfficeLocation field either missing or has a spelling error

    $attr_new_user = @{
        AccountEnabled = $true
        CompanyName = $company
        Department = $_.Department
        DisplayName = $_.Name
        GivenName = $first
        MailNickname = $mailnickname
        PasswordProfile = $password_profile
        Surname = $last
        UsageLocation = 'US'
        UserPrincipalName = $mailnickname + $domain
    }
    try {
        Write-Host ('>> Creating account for ' + $attr_new_user.DisplayName) -ForegroundColor Yellow
        New-AzureADUser @attr_new_user | Out-Null
        $user_upn = Get-AzureADUser -ObjectId $attr_new_user.UserPrincipalName | Select-Object -ExpandProperty UserPrincipalName
        Write-Host ('>> ' + $user_upn + ' has been created') -ForegroundColor Green
    }
    catch {
        Write-Host ('>> Something went wrong') -ForegroundColor Red
        Write-Warning $Error[0]
    }

...

    try {
        Write-Host ('>> Adding email alias: ' + $alternate_email + ' and office: ' + $off_loc + ' to ' + $user_upn) -ForegroundColor Yellow
        Set-Mailbox -Identity $user_upn -EmailAddresses @{ add = $alternate_email } -Office $off_loc
        Write-Host ('>> Email Alias: ' + $alternate_email + ' and office: ' + $off_loc + ' added to ' + $user_upn) -ForegroundColor Green
    }
    catch {
        Write-Host ('>> Something went wrong') -ForegroundColor Red
        Write-Warning $Error[0]
    }

我已经 运行 脚本并且 $off_loc 值被正确输入到邮箱设置的 Office 字段中。这就是为什么我无法理解如何获取此信息以使用正确的 $company$domain 字段创建用户。

感谢您对此问题的任何解决方案,感谢您花时间回答我的问题。

来自@SantiagoSquarzon:

This condition $off_loc -in $main_offices -or $corporate_offices will always be $true because $corporate_offices is not $null or empty string. It should be $off_loc -in $main_offices -or $off_loc -in $corporate_offices

确认这解决了问题。