2016-04-27 4 views
0

Ich versuche, Dateien zu finden, die nach Mitgliedern einer bestimmten AD-Gruppe mit einer foreach-Schleife mit dem folgenden Code benannt sind. Das Skript scheint ein Problem zu haben, das dazu führt, dass die Schleife nach der ersten Ausnahme stoppt. Ich denke, ich muss die Ausnahme werfen, weil es scheint, keine Standard-Rückgabewert oder Fehler, wenn keine Datei für eines der Gruppenmitglieder gefunden wird.AD-Benutzer mit Dateinamen vergleichen

$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" 
} 
} 

Ich möchte nur die Gruppenmitglieder anzeigen, die keine gleichnamige Datei haben. (Ein PDF-Formular, das die Mitgliedschaft in der AD-Gruppe rechtlich qualifiziert)

+0

so haben Sie einen Ordner sagen c: \ temp und es gibt mehrere '* .pdf' Dateien und Sie überprüfen wollen, ob es eine PDF-Datei mit dem gleichen ist Name als Gruppe? Müssen Sie auch rekursiv nach diesen Dateien suchen? –

+1

Ihr Bracing scheint ein bisschen aus, ich sehe 3 Starts Klammern aber 4 Ende Klammern ...? –

+0

Die AD-Gruppe ermöglicht ihren Mitgliedern, sich von zu Hause aus mit unserem Firmennetzwerk zu verbinden. Diese Benutzer müssen auch eine Vereinbarung unterzeichnen. Die signierten Formulare werden als PDF-Dateien in einem bestimmten Ordner gespeichert. Dieser spezielle Ordner enthält Unterordner für jede Version der Vereinbarung, was bedeutet, dass ich eine Rekursion verwende. Ich möchte herausfinden, welche Gruppenmitglieder diese Vereinbarung nicht unterzeichnet haben (es wird keine .pdf-Datei gefunden, deren Dateiname den vollständigen AD-Namen eines Gruppenmitglieds enthält). – Dominik

Antwort

0

Die Anweisung if gehört in die Schleife, und die trap sollte vor der Schleife definiert werden. Sie brauchen jedoch nicht die trap an erster Stelle, weil es sinnlos ist, Ausnahmen nur für das Echo eines Benutzernamens zu werfen. Einfach den Namen sofort wiederholen und fortfahren. Vermeiden Sie es außerdem, Code mehrmals auszuführen, wenn dies nicht erforderlich ist.

$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" } 

Das obige geht davon aus, dass die Benutzernamen nicht nur teilweise Übereinstimmungen der Datei Basisnamen sind. Andernfalls wird der Where-Object Filter wird etwas komplizierter:

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

Da die Dateinamen nur teilweise übereinstimmen, habe ich den zweiten Filter verwendet, aber es wurden keine Ergebnisse oder Fehler angezeigt. – Dominik

+0

Sorry, ich habe die Logik im zweiten Beispiel "auf den Kopf gestellt". Bitte versuche es erneut. –