使用Where-Object

时间:2015-06-15 23:13:57

标签: powershell registry

我不知道为什么我发现这么困难。从特定的注册表项下,我想根据数据(而不是名称)查询某些注册表值,并删除生成的注册表值。

例如:

screenshot of registry

如何删除此密钥中包含的任何值,例如“foo”。我可以使用Get-ItemProperty 'HKCU:\Software\Policies\Google\Chrome\RestoreOnStartupURLs'列出注册表值,但它会将一些垃圾与实际数据混合在一起:

1            : http://foo.example.com
2            : http://bar.example.com
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Policies\Google\Chrome\RestoreOnStartupURLs
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Policies\Google\Chrome
PSChildName  : RestoreOnStartupURLs
PSDrive      : HKCU
PSProvider   : Microsoft.PowerShell.Core\Registry

我试图管道Where-Object,但无法找到有效的查询。然后我需要一个可以处理结果的Remove- cmdlet。有人有什么想法吗?

1 个答案:

答案 0 :(得分:6)

我认为这个问题是要退后一步,看一看大局。你专注于价值或财产,以及如何获得你没有考虑到属性只是一个更大的对象的一部分的属性名称,关键。让我们使用密钥的对象,看看它在哪里得到我们。我将把路径分配给变量,因为我们稍后会使用它。

$KeyPath = 'HKCU:\Software\Policies\Google\Chrome\RestoreOnStartupURLs'
$ChromeKey = Get-Item $KeyPath

现在该对象是Microsoft.Win32.RegistryKey对象,内置了一些有用的方法。我们关注您的需求的是GetValueNames(),它(不出所料)为您提供了值的名称,您应该返回:

(default)
1
2

因此,我们将其输入到Where语句中,该语句获取这些名称的实际值,将它们与Foo匹配,然后我们对它们进行操作。首先,获得我们关注的那些属性:

$ChromeKey.GetValueNames() | Where {$ChromeKey.GetValue($_) -match "foo"}

该命令应返回一个值1。然后根据需要使用像Remove-ItemProperty ......

这样的东西
$ChromeKey.GetValueNames() | Where {$ChromeKey.GetValue($_) -match "foo"} | ForEach{ Remove-ItemProperty -Path $KeyPath -Name $_ }

完成后,会找到与“foo”匹配的键的所有值,并将其从键中删除。