Powershell分组

时间:2017-05-10 14:25:53

标签: powershell

我有一个CSV文件如下:

CSV that holds Service name and Priority

它包含一个Windows服务和一个优先级,我希望优先级控制服务启动和停止的顺序n。

即在优先级2之前停止所有优先级1,依此类推,直到优先级为9,这将是最后一个优先级。按顺序停止1-9后我也希望它按顺序启动。

无法解决这个问题。我不想拥有9个不同的数组,我在这些数组中存储组,因为它感觉效率低下。有什么想法或建议吗?

$Columns = "ApplicationName", "Priority"
$Applications = @()
$Path = "C:\Users\mwalters\Desktop\app-test.csv"
$CSV = Import-csv -Path $Path | Select $Columns 
$Applications += $CSV | Sort -Property Priority 
$AppsToLoopOver = @()

$i = 0

foreach ($Application in $Applications) {
   $ApplicationFromCSV = $Applications.ApplicationName[$i]
   $AppPriority        = $Applications.Priority[$i]

   $AppsToLoopOver += [PSCustomObject]@{
       Priority=$AppPriority;
       ApplicationName=$ApplicationFromCSV
   }
   $i++
}

$Group1 = @()
$Group2 = @()
$Group3 = @()

foreach ($Priority in $AppsToLoopOver.Priority) {
    if ($Priority -eq 1) {
        $Group1 += $Priority + " Group1"
    } elseif ($Priority -eq 2) {
        $Group2 += $Priority + " Group2"
    } elseif($Priority -eq 3) {
        $Group3 += $Priority + " Group3"
    }
}

$AppsToLoopOver

2 个答案:

答案 0 :(得分:2)

要对结构化数据进行分组,请使用Group-Object cmdlet:

Import-Csv $Path |
  Group-Object Priority |
  Sort-Object {[int]$_.Name} |
  ForEach-Object {
    # ... do stuff ...
  }

答案 1 :(得分:1)

您可以按优先级排序,但如果您特别希望将它们作为组进行操作,则可以使用Group-Object cmdlet,如下所示:

$VerbosePreference = 'Continue'

$ServiceGroups = Import-CSV "C:\Users\mwalters\Desktop\app-test.csv" | Group-Object Priority | Sort Name
$ServiceGroups | ForEach-Object {
    Write-Verbose "Stopping priority $($_.name) services"
    $_.Group | Select -ExpandProperty ApplicationName | Stop-Service -WhatIf
}

如果您对结果感到满意,请移除-WhatIf