2017-01-09 30 views
0

我正在嘗試創建一個屬性與下面的代碼完全相同的對象。下面的代碼位創建具有2加入NoteProperties的$ TempValueICM對象:無法正確獲取屬性和對象

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

它創建$ temptValueICM與其中出現這樣DisplayName的的NoteProperties和顯示版本數組對象:

DisplayVersion:4.92。 12.0

顯示名稱:勝20561的SmartAudio HD

DisplayVersion:

迪splayName:連接管理器

DisplayVersion:

顯示名稱:MouseSuite98 ​​

...

我試圖用拉.NET拉用下面的代碼相同的數據:

$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 
       } 
      } 
     } 

這產生一個哈希表數據,我可以得到一些信息並通過使用點符號來訪問它(例如 - 「$ TempValue.DisplayName」),但在查看對象時,它僅顯示「keys」和「values」作爲$ TempValue對象的對象屬性,而不是我想要的屬性名稱(例如 - DisplayName和DisplayVersion) 。

我已經嘗試在函數中創建一個臨時變量來將數據保存爲屬性,例如 -

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

但是,這並不做...

具體來說,我最終還是要去做就可以了排序對象 - 屬性和需要的邏輯兩種功能是相同的(即 - 使數據可以在相同的格式會來自「邏輯」,所以可以同樣的方式對待

如何獲取對象格式化,相同的信息是相同的方式爲$ TempValueICM可用。以上(即 - 我如何獲得哈希表中的項目填寫對象的屬性)?謝謝,

回答

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

是的,我可以得到它的工作,它只是給一個對象,不像頂部的代碼。兩個對象最終都是System.arrays,但是頂部產生的屬性與「Select」語句中的項目匹配,而底部沒有(它將「Keys」和「Values」列爲屬性而不是「DisplayName」)。 –

+0

我忘了在上面提到,特別是我最終必須對它做一個sort-object -properties,並且這兩個函數的邏輯需要相同。 –

+0

編輯答案以返回一組對象。我希望我能理解你的正確的目標。 – user6530384

0

以下似乎工作雖然看起來有點麻煩:

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 
    } 
} 

基本上我增加了一個單獨的變量($ ReturnInd)收集從每個每個子項運行拉。然後我做了另一個變量來包含foreach子鍵循環($ ReturnTotal)的全部結果,然後寫出來輸出。

結果與其他方法不完全相同 - 第一個產生「Deserialized.Selected.System.Management.Automation.PSCustomObject」 而這會產生「Selected.System.String」,但它們都具有屬性我需要。

我可以用下面的命令排序兩種:

$TempValue | Sort-Object -Property DisplayName 

如果有人能找出得到這個(或更好/清潔/更容易閱讀的代碼)的一個更好的辦法,請做。 ..