目前我有这个脚本:
$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个网站集中都找不到此用户,它只需要向我显示一次它找不到它。
Mathias R.Jessen的解决方案是有效的,但有一个更简单、更快的替代方案:
-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.Management.Automation.ErrorRecord
对象的类似数组的对象(类型为System.Collections.ArrayList
(。
获取错误消息的最简单方法(不是简单地将$errs
作为一个整体打印到屏幕上(是在错误记录上调用.ToString()
;例如$errs[0].ToString()
;要获取集合中所有错误消息,请使用$errs.ForEach('ToString')
。有.Exception.Message
属性,但当错误打印到显示器上时,.ErrorDetails.Message
可能会否决该属性;.ToString()
自动应用该逻辑。
.TargetObject
属性告诉触发错误的目标对象或输入;我无法亲自验证Get-SPOUser
的作用,但将不存在用户的-LoginName
参数反映在那里是有意义的;这就是它与Get-Item -Path NoSuch
类似的工作方式,例如:在生成的错误记录中,.TargetObject
包含解析为完整路径的'NoSuch'
。
内联捕获错误,然后报告最后捕获的错误数:
$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 ', ')]"
}