2017-05-16 2 views
0

J'ai une hashtable qui stocke les numéros de version des chemins d'accès aux assemblages. Je veux trouver la clé de la valeur max, que j'ai résolue dans la fonction ci-dessous. Je veux aussi savoir si le nombre de valeur max est supérieur à 1 et le stocker dans une variable. Des idées sur la façon de faire la dernière partie?

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 
} 

Répondre

4

Si vous voulez savoir si plusieurs instances partagent la plus grande valeur, je l'utilise 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)" 
} 

Une plus simple, mais peut-être moins intuitive, la manière de répondre à cette est de trier les valeurs et vérifier si les deux plus grandes valeurs sont égales:

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

J'ai d'abord mal lu la question comme "comment trouver l'entrée de hashtable avec le plus d'articles dans le champ de valeur?" - si vous voulez juste trouver l'entrée avec la plupart des articles, trier sur le nombre d'objets dans le champ de valeur:

$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)" 

écriront « c » à l'hôte

+0

Je suis après un vrai/false si le nombre d'occurrences de max (valeur) est supérieur à 1. Désolé si ma question n'était pas claire. –

+0

En fait, je viens de le résoudre avec '($ dacVersions.GetEnumerator() | where-object {$ _. Value -eq $ latestVersion}). Count' –

+1

@MarkAllison Désolé, j'ai mal lu la question, mis à jour la réponse –