将AD用户与文件名进行比较

时间:2016-04-27 14:24:55

标签: file loops powershell exception-handling

我正在尝试使用以下代码查找以foreach循环的特定AD组成员命名的文件。该脚本似乎有一个问题导致循环在第一个异常后停止。我想我需要抛出异常,因为如果找不到其中一个组成员的文件,似乎没有默认的返回值或错误。

$ErrorActionPreference = "Stop"
$BVAU = Get-ADGroupMember ADGroupName | Select-Object -Property Name
foreach($entry in $BVAU) {
    trap [System.IO.DirectoryNotFoundException]{
        Write-Host $_.Exception.Message
        continue
    }
}
if (-not (Get-ChildItem "\\samplepath" -Recurse | Where-Object FullName -like "*$entry*")) {
    throw [System.IO.DirectoryNotFoundException] "$entry not found" 
}
} 

我只想显示没有同名文件的组成员。 (合法限定AD小组成员资格的PDF表格)

1 个答案:

答案 0 :(得分:0)

if语句属于循环内部,trap应该在循环之前定义。但是,您首先不需要trap,因为仅仅因为回显用户名而抛出异常毫无意义。只需立即回复名称并继续。另外,如果不需要,请避免多次运行代码。

$files = Get-ChildItem "\\samplepath" -Recurse |
         Select-Object -Expand Basename -Unique
Get-ADGroupMember ADGroupName |
    Select-Object -Expand Name |
    Where-Object { $files -notcontains $_ } |
    ForEach-Object { "$_ not found" }

以上假设用户名不仅仅是文件基名的部分匹配。否则,Where-Object过滤器会变得稍微复杂一些:

...
Where-Object { $n = $_; -not ($files | Where-Object {$_ -like '*$n*'}) } |
...