使用 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
确认这解决了问题。
我创建了一个脚本,从 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
:
$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
确认这解决了问题。