コードの次の部分は、特定のアプリケーションを実行している場合に、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
残りのコードはどこにありますか?どのように表示されているのか分からないので、$ finalusers変数を使って何が起こっているのかは分かりません。 – pabrams
まだ手助けするのは難しいです。ヘルプセンターで記事の「最小限で完全で検証可能な例を作成する方法」の記事を読むのに役立ちます。問題がArrayList-> removeであると思われる場合は、その周りに最小限の完全で検証可能な例を構築してみてください。 – pabrams
msdnに関しては、ArrayList :: removeはObject.Equalsを使って検索を行っています。あなたは本当に** $ app.username **は** $ finalusers ** –