2016-04-27 14 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と言うフォルダを持っている:それ以外の場合Where-Objectフィルタは、もう少し複雑になる\ 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 { $n = $_; -not ($files | Where-Object {$_ -like '*$n*'}) } | 
... 
+0

ファイル名は部分的にしか一致しないので、2番目のフィルタを使用しましたが、結果やエラーは表示されませんでした。 – Dominik

+0

申し訳ありませんが、私は2番目の例では "逆さま"のロジックを持っています。もう一度お試しください。 –

関連する問題