Вывод записи Foreach при сбое одного или нескольких - PullRequest
1 голос
/ 01 апреля 2020

В настоящее время у меня есть этот скрипт:

$AdminSiteURL="https://contoso-admin.sharepoint.com"
$SiteURL=""
$UserID="klaas.hansen@contoso.nl"

$sitecollectios = @("https://contoso.sharepoint.com/sites/Extranet","https://contoso.sharepoint.com/sites/contoso","https://contoso.sharepoint.com/sites/Projecten","https://contoso.sharepoint.com/sites/PFO","https://contoso.sharepoint.com/sites/beheer","https://contoso.sharepoint.com/sites/Intranet")

#Get Credentials to connect
$Cred = Get-Credential

#Connect to SharePoint Online Admin Site

Connect-SPOService -Url $AdminSiteURL -Credential $cred

foreach ($collectie in $sitecollectios)
{ 
    Get-SPOUser -Site $collectie -LoginName $UserID
}

Когда он не может найти пользователя, однако foreach показывает ошибку. что очевидно. Возможно ли, когда он не может найти пользователя в одной или нескольких коллекциях сайта, он показывает мне ошибку в выводе записи. но не каждый раз, когда он не может его найти. так, например, он не может найти пользователя в 3 коллекциях сайта, ему нужно только один раз показать мне, что он не может его найти.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Решение Матиаса Р. Джессена эффективно, но есть более простая и быстрая альтернатива:

Общий параметр -ErrorVariable имеет редко встречаемую функцию, которая позволяет Вы добавляете ошибок, собранных во время выполнения команды, к существующей переменной, просто добавляя + к имени целевой переменной , что дает следующее решение:

foreach ($collectie in $sitecollectios)
{
  # Using built-in alias parameter names, you could shorten to:
  #   Get-SPOUser -ea SilentlyContinue -ev +errs ...
  Get-SPOUser -ErrorAction SilentlyContinue -ErrorVariable +errs -Site $collectie -LoginName $UserID 
}

# Print the errors that occurred.
$errs
  • -ErrorAction SilentlyContinue заставляет ошибки замолчать (не , не , используйте Ignore, поскольку это полностью подавит ошибки).

  • -ErrorAction +errs собирает любые ошибки в переменной $errs, добавляя их к существующей коллекции в $errs или создавая ее по требованию.

    • Обратите внимание, как переменная имя , errs должна не иметь префикс $ при передаче в -ErrorAction.

впоследствии можно просмотреть коллекцию $errs, чтобы узнать, для каких пользователей произошел сбой вызова.

$errs (например, * 105 0 * automati c $Error переменная , которая собирает ошибки в течение сеанса ) будет массивоподобным объектом (типа System.Collections.ArrayList), содержащим System.Management.Automation.ErrorRecord объектов.

Самый простой способ получить сообщение об ошибке сообщение (если не считать простого вывода $errs в целом на экран) вызов .ToString() в записи об ошибке; например, $errs[0].ToString(); чтобы получить все сообщения об ошибках в коллекции, используйте $errs.ForEach('ToString'). Существует свойство .Exception.Message, но оно может быть ситуативно отменено на .ErrorDetails.Message, когда ошибка выводится на дисплей; .ToString() применяет эту логику c автоматически.

Свойство .TargetObject сообщает вам целевой объект или вход , которые вызвали ошибку ; Я не могу лично проверить, что делает Get-SPOUser, но было бы разумно, чтобы аргумент -LoginName несуществующих пользователей был отражен там; Вот как это работает аналогично Get-Item -Path NoSuch, например: в итоговой записи об ошибке .TargetObject содержит 'NoSuch' с полным путем.

0 голосов
/ 01 апреля 2020

Перехватите встроенные ошибки и затем сообщите количество ошибок, обнаруженных в конце:

$FailedCollections = @()
Connect-SPOService -Url $AdminSiteURL -Credential $cred

foreach ($collectie in $sitecollectios)
{
    try{
        Get-SPOUser -Site $collectie -LoginName $UserID -ErrorAction Stop
    }
    catch{
        $FailedCollections += $collectie 
    }
}

if($FailedCollections.Count -ge 1){
    Write-Error "Errors encounted in $($FailedCollections.Count) collections: [$($FailedCollections -join ', ')]"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...