【问题标题】:Powershell: How to rollup Array data?Powershell:如何汇总数组数据?
【发布时间】:2015-05-18 21:33:26
【问题描述】:

我有一个自定义 cmdlet,它可以查询每个服务的状态以获取计算机的 CSV 列表,然后很好地输出到 CVS 文件,请参见下面的示例。我想获取这个 CSV 输出(实际上是通过管道传输)然后运行比较;纯数组查询。例如,计算 uniq 计算机的数量并列出在所有计算机上运行的每个服务名称,或列出未在所有计算机上运行的服务。

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

在此示例中,在每个组件上运行的服务的结果应该是:

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 我的输入 CSV 看起来像: CompName SvcName 状态 本地主机 Svc1 正在运行 本地主机 Svc2 已停止 Comp1 Svc1 正在运行 Comp1 Svc2 正在运行 Comp1 Svc3 正在运行 Comp2 Svc1 正在运行 Comp2 Svc3 正在运行

【问题讨论】:

  • 你设置行的方式是一次一个,所以Group只有一个对象可以玩。此外,您的文件有 CompName 并且您正在对不存在的 ComputerName 进行分组。

标签: arrays powershell csv


【解决方案1】:

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。就像我在我的 cmets 中所说的,你还必须匹配你的变量 CompName 不等于 ComputerName

【讨论】:

  • 感谢马特,这让我找到了更好的方向。
     function myTest { $data = import-csv .\ComputerServicesList.csv $uniqueComputerCount = ($data | Sort-Object ComputerName -Unique).Count write-host $uniqueComputerCount $RunningServices = $data | where-object {$_.State -eq "Running"} |选择 ComputerName、ServiceName # 共享的 Svcs。 $SvcsCollapsed = $RunningServices |组对象服务名称 |其中 {$_.count -eq $uniqueComputerCount} |选择名称写入输出 $SvcsCollapsed } myTest |英尺 
  • @Tropical 我不知道你是否还有问题,但是 cmets 中的代码量看起来很可怕。如果您仍有问题,请编辑您的问题。好的,我明白了,所以你只是在你的函数中使用我的代码。如果这回答了您的问题,请随时使用绿色复选标记将其标记为已回答并欢迎来到 SO。
猜你喜欢
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多