2017-05-10 13 views
1

私はCSVファイルを持っている:PowerShellのグループ化

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 

答えて

1

ていますが、特にグループとして、それらを操作したい場合は、あなたのようなGroup-Objectコマンドレットを使用することができます次のようになります。

$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を削除してください。

+0

清潔!ありがとうございました。 –

+0

グループ内の各要素をループするにはどうすればよいですか?つまり、すべてのグループ1を通過し、アプリケーション名と優先度を連結したい場合は、 –

+0

新しい質問としてこれを書いてもいいですか?そのように答える方が簡単になります。 –

2

Group-Objectコマンドレットを使用します。あなただけの並べ替えの優先順位によってできた

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

まだPowershellには初めてのもので、あなたの提案を引き続き継続する方法はわかりませんでした。助けてくれてありがとう! –

関連する問題