一个或多个失败时的Foreach写入输出



目前我有这个脚本:

$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 ', ')]"
}

最新更新