我有一个自定义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
答案 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