Powershell contando elementos de matriz que correspondem a um valor

1

Eu tenho um script que cria um PSCustomObject com propriedades baseadas na saída de um comando do DOS. O array é construído corretamente e eu posso inspecioná-lo despejando-o na saída da tela. No entanto, quando eu tento obter uma lista de elementos por nome de propriedade, isso me dá saída zero. Exemplo abaixo:

$computers = @("computer1","computer2","computer3")
ForEach ($computer in $computers) {
    quser /server:$computer | Select-Object -Skip 1 | ForEach-Object {
    $CurrentLine = $_.Trim() -Replace '\s+',' ' -Split '\s'
    $HashProps = @{
        UserName = $CurrentLine[0]
        ComputerName = $computer
        timestamp = $timestamp
    }
$tempUserList = @(New-Object -TypeName PSCustomObject -Property $HashProps | Select-Object -Property UserName,Id,State,IdleTime,LogonTime,ComputerName | % { $_ -replace '","', ','} | % { $_ -replace "^'"",''} | % { $_ -replace "'"$",''})
$userList += $tempUserList
}
$serverCount = $userList | % { $_.UserName | where ($_.ComputerName -eq $computer) }
Write-Host "Server $computer has" $serverCount.Count "Users Logged On."

}

A saída deste código é:

Server computer1 has 0 Users Logged On.
Server computer2 has 0 Users Logged On.
Server computer3 has 0 Users Logged On.

Se eu adicionar um $ userList ao script depois que o loop for concluído, recebo a seguinte saída:

@{UserName=user1; Id=2; State=Active; IdleTime=0; LogonTime=7/28/2016 7:43 AM; ComputerName=computer1}
@{UserName=user2; Id=3; State=Active; IdleTime=1:13; LogonTime=7/28/2016 11:31 AM; ComputerName=computer2}
@{UserName=user3; Id=4; State=Active; IdleTime=24692+13:29; LogonTime=7/28/2016 11:15 AM; ComputerName=computer3}

Como posso fazer com que o script reconheça a propriedade ComputerName e forneça uma contagem correta de logons?

    
por McKenning 28.07.2016 / 19:37

1 resposta

2

Eu faria mais assim (presumindo que li sua lógica corretamente):

foreach ($computer in $computers) {
  $list = @()
  $quser = quser /server:$computer | Select-Object -Skip 1
  foreach ($q in $quser) {

    $item = New-Object -TypeName PSObject
    $item | Add-Member -MemberType NoteProperty -Name ComputerName -Value $computer
    $item | Add-Member -MemberType NoteProperty -Name UserName -Value $q.Trim().Replace('\s+',' ').Split(' ')[0]
    $item | Add-Member -MemberType NoteProperty -Name TimeStamp -Value (Get-Date)

    $list += $item
  }
  $count = ($list | Where-Object -FilterScript { $_.ComputerName -eq $computer }).Count
  Write-Output "Server $computer has $count users logged on"
}
    
por 29.07.2016 / 01:04