无法正确构建属性和对象

时间:2017-01-09 19:57:25

标签: .net powershell object properties remote-registry

我正在尝试创建一个具有与下面代码相同属性的对象。以下代码创建了$ TempValueICM对象,其中添加了2个NoteProperties:

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

它创建$ temptValueICM作为数组对象,其NoteName和Display版本的NoteProperties如下所示:

DisplayVersion:4.92.12.0

DisplayName:Conexant 20561 SmartAudio HD

DisplayVersion:

DisplayName:连接管理器

DisplayVersion:

DisplayName:MouseSuite98 ​​

...

我正在尝试使用.NET pull使用以下代码提取相同的数据:

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

这会产生一个Hash表数据,我可以通过使用点表示法获取一些信息并访问它(例如 - " $ TempValue.DisplayName")但是当查看对象时它只显示&# 34;键"和"价值观" $ TempValue对象的对象属性,而不是我想要的属性名称(例如 - DisplayName和DisplayVersion)。

我尝试在函数中创建一个临时变量来将数据保存为属性,例如 -

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

但那并没有......

具体来说,我最终必须在它上面做一个sort-object -properties,并且需要两个函数的逻辑相同(即 - 这样数据可以来自"逻辑"在相同的格式,因此可以采用相同的方式处理。

如何获取格式化的对象,以便以与上面的$ TempValueICM相同的方式提供相同的信息(即 - 如何获取哈希表中的项目以填充对象的属性)?谢谢,

2 个答案:

答案 0 :(得分:0)

div(quot, 1)

答案 1 :(得分: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)来收集每个Subkey运行的每个pull。然后我创建了另一个变量来包含foreach子键循环($ ReturnTotal)的整个结果,然后将其写入输出。

结果与其他方法不完全相同 - 第一个产生“Deserialized.Selected.System.Management.Automation.PSCustomObject” 而这会产生一个“Selected.System.String”,但它们都具有我需要的属性。

我可以使用以下命令对它们进行排序:

$TempValue | Sort-Object -Property DisplayName

如果有人能找到更好的方法来获得这个(或更好/更清洁/更容易阅读的代码),请做...