Powershell:如何汇总阵列数据?

时间:2015-03-16 16:48:04

标签: arrays powershell csv

我有一个自定义cmdlet,可以查询CSV列表中的每个服务的状态,然后很好地输出到CVS文件,请参阅下面的示例。我想拿起这个CSV输出(真的管道),然后运行比较;纯数组查询。例如,计算uniq计算机的数量并列出在所有计算机上运行的每个服务名称,或者运行不在所有计算机上运行的服务。

我经历过多次试验,虽然我可以读取数组输入,但是从中选择特定的cols,我无法选择uniq Computers的列表和/或计算它们。下面是我的代码的当前版本,它拒绝折叠ComputerName llist并显示uniq值和/或正确的Count of 3。

此示例中每个comp上运行的服务的结果应为:

SVc1

我的思维错在哪里?非常感谢您的帮助。虽然不是编程新手,但我是PS



    function myTest {
    [cmdletBinding()]
        param (
           [Parameter(Mandatory=$True,
                       ValueFromPipeline=$True,
                       ValueFromPipelineByPropertyName=$True,
                       HelpMessage="Input CSV file listing ComputerNames, Servicename, State")]
            [array]$ListOfSvrsAndSvcs  
        )
        BEGIN {}
        PROCESS {
                Try {
                   #$ListOfRunningSvcs = $ListOfSvrsAndSvcs | where {$_.State -eq "Running"} | Select ComputerName, ServiceName
                   #write-output $ListOfRunningSvcs 
                   $UniqComps = $ListOfSvrsAndSvcs | group {$_.ComputerName} | select ComputerName

                   write-output $UniqComps 
                   }
                Catch {
                    write-warning $_.Exception.Message
                }
                finally {}
        }
        END {}
    }
    import-csv .\ComputerServicesList.csv | myTest | ft



My input CSV looks like:

CompName    SvcName    State
Localhost   Svc1       Running
Localhost   Svc2       Stopped
Comp1       Svc1       Running
Comp1       Svc2       Running
Comp1       Svc3       Running
Comp2       Svc1       Running
Comp2       Svc3       Running

1 个答案:

答案 0 :(得分:0)

Import-CSV会返回一个数组,因此不需要每个sei的自定义函数。直接进入Group-Object的管道将为您提供所需的答案。

$data = import-csv .\ComputerServicesList.csv
$uniqueComputerCount = ($data | Sort-Object CompName -Unique).Count
$data | Group-Object svcname | Where-Object{$_.Count -eq $uniqueComputerCount} | Select -ExpandProperty Name

这将返回所有主机上存在的所有服务。在这种情况下只是Svc1。如果你想确定它们正在运行,那么一些小的改变将会产生相同的输出

$data | Group-Object svcname,state | Where-Object{$_.Count -eq $uniqueComputerCount} | Select-Object -ExpandProperty Name | ForEach-Object{($_ -split ",")[0]}

还有更多来自此问题,但我试图将纯数组查询组件置于问题之下。您是否希望处理每一行并与一些计数变量进行比较?当PowerShell本地处理它时,这似乎是一种浪费。

目前,您的功能是一次获取一行数据,并将该单个项目传递给Group-Object。就像我在评论中说的那样,你还必须匹配你的变量CompName不等于ComputerName