2016-07-08 11 views
1

コードの次の部分は、特定のアプリケーションを実行している場合に、arraylist "finalusers"からこれらのユーザーを削除する1つの配列 "idleusers"をループすることになっています。ArrayListからの削除

$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 
+2

残りのコードはどこにありますか?どのように表示されているのか分からないので、$ finalusers変数を使って何が起こっているのかは分かりません。 – pabrams

+0

まだ手助けするのは難しいです。ヘルプセンターで記事の「最小限で完全で検証可能な例を作成する方法」の記事を読むのに役立ちます。問題がArrayList-> removeであると思われる場合は、その周りに最小限の完全で検証可能な例を構築してみてください。 – pabrams

+1

msdnに関しては、ArrayList :: removeはObject.Equalsを使って検索を行っています。あなたは本当に** $ app.username **は** $ finalusers ** –

答えて

0

ジョナサン・ミュラーさんのコメントは、ほぼ確実にあなたの問題で指しています。

比較$idleusers -contains $app.usernameは、$app.username要素を削除しようとするときのArrayListで使用される比較ほど厳密ではありません。前者の比較では、 "Domain \ UserName"は "domain \ username"と一致しますが、後者は一致しません。 -containsの代わりにを使用すると、大文字と小文字が区別されますが、問題が解決するとは思われません。比較がより一貫しているだけです。get-terminal-usersのコードを修正するのが正しい方法です。

get-terminal-usersのコードを投稿していないため、問題を再現できません。

+0

の文字列と同じ場合がありますあなたとジョナサンの助けをありがとう、これは正解でした。私は-containsコマンドを誤解し、大文字と小文字を区別していると考えました。 –

関連する問題