从ArrayList中删除不起作用

时间:2016-07-08 17:13:40

标签: powershell arraylist

以下部分代码应该循环遍历一个数组“idleusers”,如果他们也有某个应用程序正在运行,则从arraylist“finalusers”中删除这些用户。

$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

这可行,并删除了大多数所需的用户,但仍有2或3个用户未被删除。注释掉的if循环是我以前尝试和调试的循环。当您取消注释这些行并运行代码时,它会删除该用户。这意味着if语句应该正常工作,而问题很可能出在remove语句中。

编辑2 : 抱歉这个可怜的问题,我在这里潜伏了很长时间,但这是我第一次参加比赛。我阅读了帮助文章并尝试缩小代码范围。这是完整的脚本,没有函数,也没有任何与此错误无关的内容:

$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

最终编辑:谢谢,这是因为-contains不区分大小写。我确保将它们全部用小写格式化,现在它可以正常工作。

最终代码:

$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

1 个答案:

答案 0 :(得分:0)

Jonathan Muller的评论几乎肯定会指出你的问题。

比较$idleusers -contains $app.username并不像ArrayList尝试删除$app.username元素时所使用的比较那么严格。前者的比较将匹配" Domain \ UserName"使用"域\用户名",但后者不会。如果您使用-ccontains代替-contains,则会区分大小写,但我认为这不会解决您的问题,只会使比较更加一致 - 它会可能修改get-terminal-users中的代码是正确的解决方案。

但是,由于您尚未发布get-terminal-users的代码,因此我无法重现该问题。