वर्तमान में मेरे पास यह स्क्रिप्ट है:

$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 साइट कॉलेसिटॉन में नहीं ढूंढ सकता है, इसे केवल मुझे एक बार दिखाना होगा कि यह इसे नहीं ढूंढ सकता है।

1
klaas123 1 अप्रैल 2020, 13:55

2 जवाब

सबसे बढ़िया उत्तर

इनलाइन त्रुटियों को पकड़ें और फिर अंत में पकड़ी गई त्रुटियों की संख्या पर रिपोर्ट करें:

$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 ', ')]"
}
0
Mathias R. Jessen 1 अप्रैल 2020, 14:00

Mathias R. Jessen's Solution प्रभावी है, लेकिन एक सरल और तेज़ विकल्प है:

-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 (जैसे स्वचालित $Error वेरिएबल जो सत्र-व्यापी त्रुटियां एकत्रित करता है, एक सरणी जैसी वस्तु होगी (प्रकार की System.Collections.ArrayList) जिसमें System.Management.Automation.ErrorRecord ऑब्जेक्ट।

त्रुटि प्राप्त करने का सबसे आसान तरीका संदेश (सिर्फ $errs को पूरी स्क्रीन पर प्रिंट करने के अलावा) कॉल .ToString() करना है त्रुटि रिकॉर्ड पर; उदा., $errs[0].ToString(); संग्रह में सभी त्रुटि संदेश प्राप्त करने के लिए, $errs.ForEach('ToString') का उपयोग करें। .Exception.Message प्रॉपर्टी है, लेकिन जब त्रुटि डिस्प्ले पर प्रिंट हो जाती है तो इसे .ErrorDetails.Message द्वारा स्थितिजन्य रूप से खारिज किया जा सकता है; .ToString() इस तर्क को स्वचालित रूप से लागू करता है।

.TargetObject संपत्ति आपको लक्षित वस्तु या इनपुट के बारे में बताती है जिसने त्रुटि को ट्रिगर किया; मैं व्यक्तिगत रूप से सत्यापित नहीं कर सकता कि Get-SPOUser क्या करता है, लेकिन यह एक गैर-मौजूदा उपयोगकर्ताओं के -LoginName तर्क को वहां प्रतिबिंबित करने के लिए समझ में आता है; इस प्रकार यह Get-Item -Path NoSuch के अनुरूप काम करता है, उदाहरण के लिए: परिणामी त्रुटि रिकॉर्ड में, .TargetObject में 'NoSuch' एक पूर्ण पथ के लिए हल किया गया है।

0
mklement0 2 अप्रैल 2020, 15:34