以下部分代码应该循环遍历一个数组“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
答案 0 :(得分:0)
Jonathan Muller的评论几乎肯定会指出你的问题。
比较$idleusers -contains $app.username
并不像ArrayList尝试删除$app.username
元素时所使用的比较那么严格。前者的比较将匹配" Domain \ UserName"使用"域\用户名",但后者不会。如果您使用-ccontains
代替-contains
,则会区分大小写,但我认为这不会解决您的问题,只会使比较更加一致 - 它会可能修改get-terminal-users
中的代码是正确的解决方案。
但是,由于您尚未发布get-terminal-users
的代码,因此我无法重现该问题。