我正在尝试创建一个具有与下面代码相同属性的对象。以下代码创建了$ 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相同的方式提供相同的信息(即 - 如何获取哈希表中的项目以填充对象的属性)?谢谢,
答案 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
如果有人能找到更好的方法来获得这个(或更好/更清洁/更容易阅读的代码),请做...