【发布时间】:2020-05-27 23:22:14
【问题描述】:
我正在尝试选择注册表中具有 DisplayName 属性的所有卸载键,按 Displayname 排序。我原以为这会起作用。
$uninstall32 = 'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
$uninstall64 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
$uninstallKeys = (Get-ChildItem "Registry::$uninstall32" | Where-Object {$_.DisplayName} | sort DisplayName) +
(Get-ChildItem "Registry::$uninstall64" | Where-Object {$_.DisplayName} | sort DisplayName)
foreach ($uninstallKey in $uninstallKeys) {
$uninstallKey
}
但这并没有返回任何东西。如果我删除 Where-Object 我会得到结果,但没有排序。我哪里错了?
【问题讨论】:
-
我什至不认为
DisplayName是Microsoft.Win32.RegistryKey对象的属性。$uinstallKeys[0] | Get-Member不显示。 -
是的,它看起来应该是可能的,但感觉就像微软从未实现过这样的东西,唯一真正的选择是获取所有内容,然后有条件地将其添加到具有 DisplayName 的哈希表中作为键,然后对哈希表进行排序。对于像微软这样的 SEEMS 应该提供的东西来说,这是一项艰巨的工作。
-
@AdminOfThings 再检查几个,比如
$uninstallKeys[0..9]或类似的,你可能会遇到一个。这是我从未真正习惯的注册表的怪癖之一。对我来说,当您只是为文件系统提供商编写代码时,我一直觉得必须从 pandas、天气预报和失望的概念中捕捉到偶尔的异常——试图找到一个文件、文件夹或其他东西。 -
这只是
Sort-Object的一些奇怪行为。Sort-Object单独根据特定对象类型的默认属性集进行排序如果没有向命令提供任何属性。但是Sort-Object DisplayName和Sort-Object RandomString的排序方式相同,这与根本不提供任何属性不同。这会导致三种不同的排序方案:默认、实际属性或假属性的不同视图。我认为实际看到DisplayName属性值需要额外的Get-ItemProperty。 -
Get-ItemProperty是此处用于获取 DisplayName 属性和其他的 cmdlet...话虽如此,由于程序注册了他的密钥,我遇到了“指定的强制转换无效”类型的问题那里有它不应该有的东西。为了避免这种情况,遍历每个项目然后从 try catch 中获取项目属性将完美地工作。唯一的缺点是当前方法会跳过(如果有的话)格式无效的密钥。
标签: powershell sorting filtering get-childitem