2016-04-27 68 views
0

我在使用以下代码查找以foreach循环找到的特定AD组成员的文件。该脚本似乎有一个问题导致循环在第一个异常之后停止。我想我需要抛出异常,因为如果没有找到任何组成员的文件,似乎没有默认返回值或错误。将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

让你有一个文件夹,例如c:\ temp中有几个'* .pdf'文件,并要检查是否有与同一个PDF文件名称作为组?另外,你是否需要递归扫描该文件? –

+1

你的支撑似乎有点偏离,我看到3个开始的大括号,但是4个末端大括号......? –

+0

AD集团使其成员能够从家中连接到我们的公司网络。这些用户还必须签署协议。签名表格将作为.pdf文件存储在特定的文件夹中。这个特定的文件夹有每个协议版本的子文件夹,这意味着我使用递归。我想知道哪些组成员未签署该协议(在文件名包含组成员AD全名的情况下,找不到.pdf文件)。 – Dominik

回答

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*'}) } | 
... 
+0

由于文件名只匹配部分我使用第二个过滤器,但它没有显示任何结果或错误。 – Dominik

+0

对不起,我在第二个例子中得到了逻辑“颠倒”。请再试一次。 –

相关问题