3 votes

Sélectionner la valeur répétée de Keys à partir de 2 hashtables

Ma tâche est d'associer les services en cours d'exécution avec les processus dans Windows.

$a = Get-CimInstance -ClassName Win32_Service | Where-Object {$_.State -match "Running"} | Select-Object -Property ProcessId,Name
$b = Get-CimInstance -ClassName Win32_Process | Select-Object -Property ProcessId,Name
$d = @{$b.ProcessId=$b.Name}
$c = @{$a.ProcessId=$a.Name}

Donc, j'ai deux tables de hachage, et maintenant je veux faire une nouvelle table de hachage, qui sera composée de $a.Name y $b.Name mais à partir de ces valeurs, où $a.processid=$b.processid . Ou peut-être quelqu'un peut-il me conseiller sur la façon de combiner les valeurs avant de les mettre dans les hashtables. Merci

2voto

OwlsSleeping Points 1142

J'ai essayé, et j'ai surtout obtenu svchost.exe sur ma machine pour les services - est-ce normal ?

$Services = Get-CimInstance -ClassName Win32_Service |
    Where-Object {$_.State -eq "Running"} |
    Select-Object -Property ProcessId,Name

$Processes = Get-CimInstance -ClassName Win32_Process |
    Select-Object -Property ProcessId,Name

$Combined = foreach ($Service in $Services) {
    $ProcessName = ($Processes.Where{$_.ProcessId -eq $Service.ProcessId}).Name
    if($ProcessName) {
        New-Object -TypeName PSCustomObject -Property @{
            Service = $Service.Name
            Process = $ProcessName
        }
    }
}

$Combined

2voto

Abraham Zinala Points 1229

Vous ne pouvez pas avoir des noms de clés en double dans une table de hachage.

Donc vous êtes mieux avec un PSCustomObject c'est en fait une table de hachage :

$Services  = Get-CimInstance -ClassName WIN32_Service | Sort-Object -Property Name

foreach($service in $Services){
    try{
        [PSCustomObject]@{
            "Service Name" = $Service.Name
            "Process Name" = (Get-Process -Id $service.ProcessID).Name
            "Process ID  " = $service.ProcessID
            "Description"  = $service.Description
            }
        } Catch {
        $Error[0].exception.message
        }
    }

Je suis également certain que vous recherchez le nom du service associé et non le nom du processus, puisque Get-Process retourne déjà cette information pour vous.

EDITAR

En y réfléchissant un peu plus... Peut-être que si vous intervertissez l'ordre dans ce que vous voulez, c'est-à-dire le nom du service d'abord, puis le nom du processus, vous pouvez utiliser une balise table de hachage :

$Services  = Get-CimInstance -ClassName WIN32_Service | Sort-Object -Property Name
$HashTable = @{}
$other = @{}

foreach($service in $Services){
    Try{
        $HashTable.Add($service.Name,$((Get-Process -ID $service.ProcessId).Name) ) 
    }Catch{
        $other.Add($service.Name,$((Get-Process -ID $service.ProcessId).Name) ) 
    }
}

J'ai ajouté une table de hachage secondaire juste au cas où il y aurait un service de même nom (ce qui ne devrait pas être le cas), vous serez toujours en mesure de récupérer la paire clé-valeur. Bien que cela fonctionne, je recommande toujours d'utiliser une table de hachage secondaire. PSCustomObject car cela vous donne plus de possibilités de travailler.

Cela fonctionne parce que les noms des services sont uniques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X