无法正确获取属性和对象结构
Trouble getting properties and object structured correctly
我正在尝试创建一个具有与以下代码相同的属性的对象。以下代码创建了 $TempValueICM 对象,其中添加了 2 个 NoteProperties:
$TempValueICM = Invoke-Command -ComputerName $computer -ScriptBlock {
$AppPull = Get-ItemProperty HKLM:\software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion}
它将 $temptValueICM 创建为数组对象,其 NoteProperties 为 DisplayName 和 Display version,如下所示:
显示版本:4.92.12.0
显示名称:Conexant 20561 SmartAudio HD
显示版本:
显示名称:连接管理器
显示版本:
显示名称: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
}
}
}
这会生成一个哈希 table 数据,我可以获取一些信息并使用点符号(例如 - "$TempValue.DisplayName")访问它,但是当查看它显示的对象时只有 "keys" 和 "values" 作为 $TempValue 对象的对象属性,而不是我想要的 属性 名称(例如 - DisplayName 和 DisplayVersion)。
我尝试在函数中创建一个临时变量来将数据保存为属性,例如-
$Temp = "" | select DisplayName, DisplayVersion
$Temp.DisplayName += ,$DisplayName
$Temp.Publisher += ,$Publisher
$Temp.DisplayVersion += ,$DisplayVersion
但那不行...
具体来说,我最终将不得不对其执行一个 sort-object -properties 并且需要两个函数的逻辑相同(即 - 这样数据就可以来自相同的 "logic"格式,以便可以以相同的方式处理。
如何格式化对象,以便以与上述 $TempValueICM 相同的方式提供相同的信息(即 - 如何获取散列 table 中的项目以填写属性物体)?谢谢,
$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
尽管看起来有点笨拙,但以下内容似乎有效:
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
如果有人能想出更好的方法来获得这个(或better/cleaner/easier-to-read代码),请做...
我正在尝试创建一个具有与以下代码相同的属性的对象。以下代码创建了 $TempValueICM 对象,其中添加了 2 个 NoteProperties:
$TempValueICM = Invoke-Command -ComputerName $computer -ScriptBlock {
$AppPull = Get-ItemProperty HKLM:\software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion}
它将 $temptValueICM 创建为数组对象,其 NoteProperties 为 DisplayName 和 Display version,如下所示:
显示版本:4.92.12.0
显示名称:Conexant 20561 SmartAudio HD
显示版本:
显示名称:连接管理器
显示版本:
显示名称: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
}
}
}
这会生成一个哈希 table 数据,我可以获取一些信息并使用点符号(例如 - "$TempValue.DisplayName")访问它,但是当查看它显示的对象时只有 "keys" 和 "values" 作为 $TempValue 对象的对象属性,而不是我想要的 属性 名称(例如 - DisplayName 和 DisplayVersion)。
我尝试在函数中创建一个临时变量来将数据保存为属性,例如-
$Temp = "" | select DisplayName, DisplayVersion
$Temp.DisplayName += ,$DisplayName
$Temp.Publisher += ,$Publisher
$Temp.DisplayVersion += ,$DisplayVersion
但那不行...
具体来说,我最终将不得不对其执行一个 sort-object -properties 并且需要两个函数的逻辑相同(即 - 这样数据就可以来自相同的 "logic"格式,以便可以以相同的方式处理。
如何格式化对象,以便以与上述 $TempValueICM 相同的方式提供相同的信息(即 - 如何获取散列 table 中的项目以填写属性物体)?谢谢,
$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
尽管看起来有点笨拙,但以下内容似乎有效:
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
如果有人能想出更好的方法来获得这个(或better/cleaner/easier-to-read代码),请做...