Обработка ошибок Powershell при обработке списка - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь очистить активный каталог перед развертыванием Skype 4 Business, которое требует корректировки sip-адресации. После того, как я немного покопался, я обнаружил другие проблемы, в том числе необычные форматы электронных писем, которые мне нужно учитывать. Меня попросили выкатить изменения, но из-за ошибки Get-CsAdUser -Identity $line.Name, когда пользователь не может быть найден. Однако это означает, что они забирают слот у пользователя, которого можно изменить, как написано в это время.

Хотелось бы, чтобы при возникновении ошибки увеличилось $line, не увеличивалось $limiter, и попробуйте снова со следующим человеком в списке. Я все еще читаю, как использовать try/catch и return, но я все еще не уверен, как их структурировать, чтобы скрипт мог обрабатывать еще 25 человек при каждом запуске.

## Collect User Base
Get-CsAdUser  -OU "OU=..." -Filter {Enabled -eq $True}  | Where-Object{$_.UserAccountControl -notmatch "AccountDisabled"}| Select Name, WindowsEmailAddress, SipAddress|Export-Csv -NoTypeInformation -Append -Path c:\tmp\EmailSIP_$d.csv
$csv = Import-csv c:\tmp\EmailSIP_$d.csv

## Change 25 users
$first = $True
$limiter = 0
foreach ($line in $csv){
    $goodsip =  -join ("sip:", $line.WindowsEmailAddress)
    $sipcheck = ($goodsip -ne $line.SipAddress) #If SIP not as expected then "proceed with change is TRUE"
    $otherchecks #If no other AD fields are formatted 'incorrectly' will "proceed with change be True"
    If ($emailcheck -And $otherchecks){
        If ($first) {
            Write-Output (-join ("Name, WindowsEmailAddress, old-SipAddress, new-SipAddress"))|Out-File -Append c:\tmp\Changed_EmailSIP_$d.txt
            $first = $False}
        If ($limiter -lt 25){
            Write-Output (-join ($line.Name,", ", $line.WindowsEmailAddress,", ", $line.SipAddress,", ", $goodsip))|Out-File -Append c:\tmp\Changed_EmailSIP_$d.txt
#Errors Generated in following line for some $line.NAMES
        Get-CsAdUser -Identity $line.Name|Set-CsUser -SipAddress $goodsip -ErrorAction Ignore  -whatif 
        $limiter++}
    If ($limiter -ge 25){break}  #exit loop if 25 changes
    }  #end of IF Email and Sip
}  #end of foreach

Ошибка, которую я получаю:

Get-CsAdUser : Management object not found for identity "person1".
At line:3 char:1
+ Get-CsAdUser -Identity $line.Name|Set-CsUser -SipAddress $goodsip -wh ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (person1:UserIdParameter) [Get-CsAdUser], ManagementException
    + FullyQualifiedErrorId : Identity,Microsoft.Rtc.Management.AD.Cmdlets.GetAdUserCmdlet

1 Ответ

0 голосов
/ 08 марта 2019

Спасибо @TheIcorrigible за ваш комментарий.

Рабочий код:

foreach ($line in $csv){
$goodsip =  -join ("sip:", $line.WindowsEmailAddress)
$sipcheck = ($goodsip -ne $line.SipAddress)
$otherchecks
If ($emailcheck -And $otherchecks){
    If ($limiter -lt 25){
        try{
            Get-CsAdUser -Identity $line.Name -ErrorAction Stop|Set-CsUser -SipAddress $goodsip -whatif
            If ($first) {
                Write-Output (-join ("Name, WindowsEmailAddress, old-SipAddress, new-SipAddress"))|Out-File -Append c:\tmp\Changed_EmailSIP_$d.txt
                $first = $False}
            Write-Output (-join ($line.Name,", ", $line.WindowsEmailAddress,", ", $line.SipAddress,", ", $goodsip))|Out-File -Append c:\tmp\Changed_EmailSIP_$d.txt
            $limiter++}
        catch{continue}
        }
    If ($limiter -ge 25){break}
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...