我正在尝试使用以下代码查找以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表格)
答案 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*'}) } |
...