2016-07-08 12 views
1

Der folgende Teil des Codes soll Schleife über ein Array "leuseusers", diese Benutzer von einer Arraylist "finalusers" entfernen, wenn sie auch eine bestimmte Anwendung ausgeführt haben.Entfernen von ArrayList funktioniert nicht

$apps = get-process -IncludeUserName | Sort-Object -Property ID -Unique 

foreach ($app in $apps){ 
    if ($idleusers -contains $app.username) { 
     if ($app.path -like 'C:\Program Files (x86)\DirectoryOfTheApplication\*') { 
      #if ($app.username -eq 'Domain\UsernameThatDoesNotRemove') { 
      # $finalusers.remove('Domain\UsernameThatDoesNotRemove') 
      #} 
      $finalusers.remove($app.username) 
     } 
    } 
} 

$finalusers 

Dies funktioniert, und die meisten der gewünschten Benutzer entfernt, aber es gibt 2 oder 3 Benutzer übrig, die nicht entfernt bekam. Die auskommentierte if-Schleife ist eine, die ich zum Testen und Debuggen verwendet habe. Wenn Sie diese Zeilen entfernen und den Code ausführen, wird der Benutzer entfernt. Dies bedeutet, dass die if-Anweisungen ordnungsgemäß funktionieren sollten und das Problem höchstwahrscheinlich mit der remove-Anweisung auftritt.

Edit 2: Sorry für die schlechte Frage, ich habe für eine lange Zeit ein Lurker hier gewesen, aber dies ist meine erste Chance auf die Teilnahme. Ich habe den Hilfeartikel gelesen und versucht, den Code einzugrenzen. Hier ist es, das vollständige Skript, ohne die Funktionen und ohne alles, was nicht auf diesen Fehler beziehen haben:

$quserresult = invoke-expression -Command "quser /SERVER:$serverName" | select -Skip 1  

$users = @() 

foreach($row in $quserresult) 
{   
    $person = new-object Object 
    $columns = $row.Replace(" ", " ").Split(" ") | ? {$_ -ne ""}  

    $person | add-member -membertype noteproperty -name UserName -value $columns[0]   

    $users += $person 
} 

$idleusers = @() 
foreach($usrn in $users){ 
    $nme = $usrn.UserName 
    $idleusers += "Domain\$nme"  
} 

[System.Collections.ArrayList]$finalusers = $idleusers 

$apps = get-process -IncludeUserName | Sort-Object -Property ID -Unique 

foreach ($app in $apps){ 
    if ($idleusers -contains $app.username) { 
     if ($app.path -like 'C:\Program Files (x86)\DirectoryOfTheApplication\*') { 
      #if ($app.username -eq 'Domain\UsernameThatDoesNotRemove') { 
      # $finalusers.remove('Domain\UsernameThatDoesNotRemove') 
      #} 
      $finalusers.remove($app.username) 
     } 
    } 
} 

$finalusers 

Finale Edit: Danke, es war, weil -contains nicht empfindlich ist case. Ich habe dafür gesorgt, dass alles in Kleinbuchstaben formatiert wurde und jetzt funktioniert es.

Der endgültige Code:

$quserresult = invoke-expression -Command "quser /SERVER:$serverName" | select -Skip 1  

$users = @() 

foreach($row in $quserresult) 
{   
    $person = new-object Object 
    $columns = $row.Replace(" ", " ").Split(" ") | ? {$_ -ne ""}  

    $person | add-member -membertype noteproperty -name UserName -value $columns[0]   

    $users += $person 
} 

$idleusers = @() 
foreach($usrn in $users){ 
    $nme = $usrn.UserName.ToLower() 
    $idleusers += "staley\$nme"  
} 

[System.Collections.ArrayList]$finalusers = $idleusers 

$apps = get-process -IncludeUserName | Sort-Object -Property ID -Unique 

foreach ($app in $apps){ 
    $appuser = $null 
    $appuser = $app.username 
    if ($appuser) { 
     if ($idleusers -contains $appuser.ToLower()) { 
      if ($app.path -like 'C:\Program Files (x86)\DirectoryOfTheApplication\*') { 
       $finalusers.remove($appuser.ToLower()) 
      } 
     } 
    } 
} 

$finalusers 
+2

Wo ist der Rest des Codes? Wir können Ihnen nicht sagen, was mit der Variablen $ finalusers los ist, weil Sie nicht gezeigt haben, wie sie gefüllt ist. – pabrams

+0

Es ist immer noch schwer zu helfen. Es kann Ihnen helfen, den Artikel "So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel" in der Hilfe zu lesen. Wenn Sie vermuten, dass das Problem mit ArrayList-> remove auftritt, versuchen Sie, ein minimales, vollständiges und überprüfbares Beispiel dafür zu erstellen. – pabrams

+1

In Bezug auf msdn verwendet ArrayList :: remove Object.Equals, um die Suche durchzuführen. Sind Sie sicher, dass ** $ app.username ** den gleichen Fall hat wie die Zeichenfolgen in ** $ finalusers ** –

Antwort

0

Jonathan Müller Kommentar fast weist sicherlich auf Ihr Problem. Der Vergleich $idleusers -contains $app.username ist nicht so streng wie der von ArrayList verwendete Vergleich, wenn versucht wird, das Element $app.username zu entfernen. Der vorherige Vergleich wird "Domain \ UserName" mit "Domäne \ Benutzername" übereinstimmen, letzteres jedoch nicht. Wenn Sie -ccontains anstelle von -contains verwenden, wäre das die Groß-/Kleinschreibung, aber ich glaube nicht, dass das Ihr Problem lösen wird, es würde nur die Vergleiche konsistenter machen - es ist wahrscheinlich, dass die Änderung in get-terminal-users die richtige Lösung ist. Das Problem kann nicht reproduziert werden, weil Sie den Code für get-terminal-users nicht veröffentlicht haben.

+0

Danke für Sie und Jonathans Hilfe, das war die richtige Antwort. Ich habe den Befehl -contains missverstanden und dachte, dass die Groß-/Kleinschreibung beachtet werden muss. –

Verwandte Themen