2017-05-16 2 views
0

Ich habe eine Hashtabelle, die Versionsnummern von Pfaden zu Assemblys speichert. Ich möchte den Schlüssel des Maximalwertes finden, den ich in der folgenden Funktion gelöst habe. Ich möchte auch herausfinden, ob die Anzahl der maximalen Werte größer als 1 ist und diese in einer Variablen speichern. Irgendwelche Ideen, wie man den letzten Teil macht?

Function Get-LatestDacFxPath 
{ 
    [cmdletbinding()] 
    $knownPaths = (
     'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120', 
     'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\130', 
     'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140', 
     'C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin', 
     'C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin', 
     'C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin', 
     'C:\Program Files (x86)\NuGet\Packages\Microsoft.Data.Tools.Msbuild\lib\net40' 
    ) 

    $dacAssembly = 'Microsoft.SqlServer.Dac.dll' 
    [hashtable]$dacVersions = @{} 
    foreach($dacPacPath in $knownPaths) 
    { 
     if(Test-Path($dacPacPath)) { 
      $dacVersions[$dacPacPath] = (Get-ItemProperty -Path (Join-Path $dacPacPath $dacAssembly)).VersionInfo.ProductVersion 
     } 
    } 

    $PathOfLatestVersion = ($dacVersions.GetEnumerator() | sort value -Descending | select -First 1).Key 
    $LatestVersion = ($dacVersions.GetEnumerator() | sort value -Descending | select -First 1).Value 
} 

Antwort

4

Wenn Sie herausfinden wollen, ob mehrere Instanzen den höchsten Wert zu teilen, würde ich verwenden Group-Object:

$HighestValueBracket = $dacVersions.GetEnumerator() |Group Value |Sort {$_.Name -as [version]} -Descending |Select -First 1 
if($HighestValueBracket.Count -gt 1){ 
    Write-Host "Multiple instances with version $($HighestValueBracket.Name)" 
} 

Eine einfachere, aber vielleicht weniger intuitiv, Weg, dies zu beantworten ist, um die Werte zu sortieren , und testen, ob die beiden größten Werte gleich sind:

$sortedVersionEntries = $dacVersions.GetEnumerator() |Sort Value -Descending 
if($sortedVersionEntries[0].Value -eq $sortedVersionEntries[1]){ 
    Write-Host "Multiple instances with version $($sortedVersionEntries[0].Value)" 
} 

Ich habe die Frage ursprünglich falsch gelesen, als "wie finde ich einen Hashtable-Eintrag mit den meisten Elementen im Wertfeld?" - wenn Sie nur wollen, mit den meisten den Eintrag zu finden, sortiert auf der Anzahl der Objekte im Wertfeld:

$HashTable = @{ 
    a = 1,2 
    b = 1 
    c = 1,2,3,4 
    d = 1,2,3 
} 
$MaxEntry = $HashTable.GetEnumerator() |Sort {@($_.Value).Count} -Descending |Select -First 1 
Write-Host "Key with most entries: $($MaxEntry.Key)" 

schreiben „c“ an den Host

+0

ich nach einem wahren bin/false, ob die Anzahl der Vorkommen von max (Wert) größer als 1 ist. Sorry, wenn meine Frage nicht klar war. –

+0

Eigentlich habe ich es nur mit '($ dacVersions.GetEnumerator() | where-object {$ _. Wert -eq $ latestVersion}) gelöst. Count' –

+1

@MarkAllison Sorry, ich habe die Frage falsch gelesen, aktualisierte Antwort –

Verwandte Themen