2017-01-09 1 views
0

J'essaie de créer un objet avec des propriétés identiques au code ci-dessous. Le bit de code suivant crée l'objet TempValueICM $ avec 2 ajouté NoteProperties:Problème lors de l'obtention des propriétés et de la structure correcte de l'objet

$TempValueICM = Invoke-Command -ComputerName $computer -ScriptBlock { 
       $AppPull = Get-ItemProperty HKLM:\software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
        Select-Object DisplayName, DisplayVersion} 

Il crée temptValueICM $ comme un objet de tableau avec NoteProperties de DisplayName et la version d'affichage qui apparaissent comme ceci:

DisplayVersion: 4,92. 12,0

DisplayName: Conexant 20561 SmartAudio HD

DisplayVersion:

Di splayName: Connection Manager

DisplayVersion:

DisplayName: MouseSuite98

...

Je suis en train de tirer les mêmes données à l'aide tirer .NET avec le code suivant:

$Hive = [Microsoft.Win32.RegistryHive]::LocalMachine 
$AppAddressMain = "software\Microsoft\Windows\CurrentVersion\Uninstall\" 
$AppAddressWOW = "software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" 



Function Get-InstalledApps { 
    param ($MainHive, $Computer, [string[]]$RegAddress) 

    Foreach($Address in $RegAddress) { 
     $RegBaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($MainHive, $computer) 
     $RegSubKey= $RegBaseKey.OpenSubKey($Address) 
     foreach($Subkey in $RegSubKey.GetSubKeyNames()){ 
      $AppAddress = $Address + $Subkey 

      $DisplayName = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayName") 
      $DisplayVersion = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayVersion") 
      Write-Output @{ 
       DisplayName = $DisplayName 
       DisplayVersion = $DisplayVersion 
       } 
      } 
     } 

Cela produit des données de table de hachage et je peux obtenir des informations et y accéder en utilisant la notation par points (par exemple - "$ TempValue.DisplayName") mais en regardant l'objet il montre seulement "keys" et "values" comme propriétés d'objet pour l'objet $ TempValue au lieu de ce que je voudrais être les noms de propriété (par exemple - DisplayName et DisplayVersion) .

J'ai essayé de créer une variable temporaire dans la fonction pour conserver les données en tant que propriétés, par ex. -

$Temp = "" | select DisplayName, DisplayVersion 
    $Temp.DisplayName += ,$DisplayName 
    $Temp.Publisher += ,$Publisher 
    $Temp.DisplayVersion += ,$DisplayVersion 

Mais cela ne le fait pas ...

Plus précisément je vais finalement avoir à faire un tri -properties objet sur elle et la nécessité de la logique pour les deux fonctions soient les mêmes (c'est-à-dire que les données peuvent provenir de l'une ou l'autre logique dans le même format, de manière à ce qu'elles puissent être traitées de la même manière

Comment obtenir l'objet formaté pour que la même information soit disponible de la même manière que le $ TempValueICM ci-dessus ci-dessus (ie - comment puis-je obtenir les éléments dans la table de hachage pour remplir les propriétés sur l'objet)? Merci,

Répondre

0
$Hive = [Microsoft.Win32.RegistryHive]::LocalMachine 
$AppAddressMain = "software\Microsoft\Windows\CurrentVersion\Uninstall\" 
$AppAddressWOW = "software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" 

Function Get-InstalledApps 
{ 
    param ($MainHive, 
     $Computer, 
     [string[]]$RegAddress) 

    Foreach ($Address in $RegAddress) 
    { 
     $RegBaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($MainHive, $computer) 
     $RegSubKey = $RegBaseKey.OpenSubKey($Address) 
     $output = @() 
     foreach ($Subkey in $RegSubKey.GetSubKeyNames()) 
     { 
      $AppAddress = $Address + $Subkey 
      $DisplayName = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayName") 
      $DisplayVersion = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayVersion") 
      $output += [PSCustomObject]@{ DisplayName = $DisplayName; DisplayVersion = $DisplayVersion } 
     } 
    } 
    return $output 
} 

Get-InstalledApps -MainHive $Hive -Computer "MyPC" -RegAddress $AppAddressMain | sort DisplayName 
+0

Oui, je peux le faire fonctionner, il donne juste un objet qui n'est pas comme le code en haut. Les deux objets finissent par être System.arrays mais le haut produit un élément avec des propriétés correspondant aux éléments de l'instruction "Select" et le bas ne le fait pas (Il répertorie "Keys" et "Values" comme propriétés au lieu de "DisplayName" –

+0

J'ai oublié de mentionner ci-dessus que spécifiquement je devrai éventuellement faire un tri-objet-propriétés sur elle et besoin de la logique pour les deux fonctions pour être le même –

+0

Edited la réponse pour retourner un tableau d'objets.J'espère avoir compris votre but correctement. – user6530384

0

Ce qui suit semble fonctionner bien qu'il semble un peu maladroit:

Function Get-InstalledApps { 
    param ($MainHive, $Computer, [string[]]$RegAddress) 

    Foreach($Address in $RegAddress) { 
     $RegBaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($MainHive, $computer) 
     $RegSubKey= $RegBaseKey.OpenSubKey($Address) 
     $ReturnTotal = foreach($Subkey in $RegSubKey.GetSubKeyNames()){ 
      $ReturnInd = "" | Select-Object DisplayName, DisplayVersion 
      $AppAddress = $Address + $Subkey 
      $DisplayName = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayName") 
      $DisplayVersion = $($RegBaseKey.OpenSubKey($AppAddress)).GetValue("DisplayVersion") 

      $ReturnInd.DisplayName = $DisplayName 
      $ReturnInd.DisplayVersion = $DisplayVersion 
      Write-Output $Return 
     } 
     Write-Output $ReturnTotal 
    } 
} 

Essentiellement, j'ajouté une variable individuelle ($ ReturnInd) pour recueillir chaque traction de chaque cycle de Subkey. Ensuite, j'ai fait une autre variable pour contenir l'ensemble des résultats de la boucle de sous-clé foreach ($ ReturnTotal), puis l'ai écrit en sortie.

Le résultat est pas exactement comme l'autre méthode - le premier produit un « Deserialized.Selected.System.Management.Automation.PSCustomObject » alors que ce produit un « Selected.System.String », mais ils ont tous deux les propriétés J'ai besoin.

Je suis en mesure de trier à la fois avec la commande suivante:

$TempValue | Sort-Object -Property DisplayName 

Si quelqu'un peut trouver une meilleure façon d'obtenir ce (ou mieux/plus propre/plus facile à lire le code), s'il vous plaît faire.