在 powershell 脚本中捕获错误

Catching errors within powershell script

我已经编写了一个脚本来从文件目录中提取权限,以便我们可以审核对文件夹的访问。我只是想看看我们有哪些组,没有哪些用户,所以我写了这个脚本来提取所有组名并从值中删除域名,这样它就可以 运行 通过第二个更正 AD​​ 的脚本如果我们的组名根本不正确,因为我们 运行 遇到了一个问题,由于某种原因,有些人返回的名称略有不同。问题是所有在权限中命名的 AD 用户都返回错误。我希望这些错误甚至不显示在屏幕上,有没有办法做到这一点?如您所见,我一直在尝试几种不同的方法将它们通过管道传输到日志或 -ea ignore 选项,但它仍然在屏幕上显示错误。

$filelocationscsv = "C:\AD\Excel\File Share migration.csv"
$filelocationcsvcontents = Get-Content -LiteralPath $filelocationscsv

$AllFolders = @()
foreach ($location in $filelocationcsvcontents) {
    $AllFolders += $location.Substring(0,$location.Length-1)
}

$outputfilelocation = "C:\AD\Excel\permissions.csv"

$Results = @()
$errResults = @()
Foreach ($i in $Allfolders) {
    if (Test-Path $i){
    Write-Host "Obtaining file permissions for $i."
    $acl = (Get-Acl $i -Filter *).Access | select -ExpandProperty IdentityReference
    foreach($Access in $acl) {
    if ($Access.Value -notlike "BUILTIN\Administrators" -and $Access.Value -notlike "domain\Domain Admins" -and $Access.Value -notlike "CREATOR OWNER" -and $access.Value -notlike "NT AUTHORITY\SYSTEM" -and $access.Value -notlike "Everyone" -and $access.Value -notlike "BUILTIN\Users" -and $access.Value -notlike "s-1*") {
    [string]$perm = $Access.Value.Split('\')[1]
      if($checkgroup = Get-ADGroup $perm){
#try
#{
##                if( $LASTEXITCODE -gt 0 ){
##                # Handle the error here
##                # This example writes to the error stream and throws a terminating error
##                $errResults += $LASTEXITCODE
##                Write-Error "Unable to ping server, ping returned" -EA Ignore
##                }
                $Properties = [ordered]@{'AD Group'=$perm}
                $Results += New-Object -TypeName PSObject -Property $Properties
#}
#Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
#{
#                Write-Verbose "$perm skipped." -Verbose
#                #$ErrorMessage = 
#                #$FailedItem = $_.Exception.ItemName
#                #$errResults += $ErrorMessage + $FailedItem
#}
                }
            }

        }
    }
    else {
    Write-Host "$i is not accessible"
    }
}

$Results | select -Property 'AD Group' -Unique | Export-Csv $outputfilelocation -NoTypeInformation

值得注意的是,这些错误并没有阻止我的脚本 运行 发挥其更多的审美功能以及我自己的学习机会。我可以按原样使用我的脚本,但我想让它看起来更干净,并学习如何更好地处理错误。

谢谢@pwnosh,你真是个天才!

我将第 20 行更改为

  if($errResults += try {$checkgroup = Get-ADGroup $perm -ErrorAction Stop } catch {[Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]}){

这一行也强制用户进入我的 CSV,但是第二个脚本无论如何都会用

清除它们
$results = @()
foreach($Group in ($Groups = Import-csv C:\AD\Excel\permissions.csv)){
    $groupname = $Group.'AD Group'
    Write-Host "Confirming $groupname group name in AD."
    $results += get-adgroup -Filter "name -like '$groupname'" -Properties * -SearchBase "dc=domain,dc=local,dc=net" | select name
}
$results | Export-Csv C:\AD\Excel\ADGroups.csv -NoTypeInformation

如你 表示您有兴趣了解更多有关错误处理的信息,我本周学到的一件事是这些用于错误处理和记录的常用参数:

-ErrorAction
-WarningAction
-ErrorVariable
-WarningVariable

您可以使用参数 -ErrorAction SilentlyContinue 消除错误消息,但使用参数 -ErrorVariable

捕获错误
EXAMPLE: get-adgroup -ErrorAction SilentlyContinue -ErrorVariable MyErrors

您可以通过调用 $MyErrors

来读取和处理错误

警告的工作方式相同

它可能会替代 Try/Catch