首页 > 解决方案 > 如何使用 PowerShell 删除 REG_DWORD 注册表值,其中注册表值如 '*String*'?

问题描述

PowerShell 将注册表值(及其注册表数据)作为数组显示$\_.Property在其父注册表项中。如何仅选择和删除值所在的注册表值\*String\*

我尝试在 StackOverflow 和 Google 上搜索高低搜索,尝试了许多涉及Get-ItemGet-ItemPropertyGet-ChildItemSelect-Object(包括-ExpandProperty参数)的组合,并Where-Object选择了我想要的注册表值(在继续合并删除之前)。我现在完全无能为力,无法弄清楚如何简单地查找注册表值(例如\*Text\*存在于特定注册表项中)并删除它们。如此简单的事情似乎如此困难!我不知道如何处理数组中的数据!

Get-Item -Path HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\SharedDLLs

$\_.Property每个注册表值都作为注册表项下的数组的一部分列出HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\SharedDLLs。我期待的结果是我可以做一些大致的事情,比如$\_.RegistryValue -Like '\*Text\*' | Remove-Item删除匹配的注册表值\*Text\*

为了澄清以确保某些词汇的正确技术使用,“注册表项”显示为 regedit.exe 中的文件夹。

“注册表值”是任何类型的条目,例如REG\_SZREG\_DWORDREG\_MZ等。注册表值包含“注册表数据”,根据注册表类型,它可能是字符串、32 位值(有时表示为 1、0 或 0x000000、0x000001)。

我们经常将“注册表值”称为“注册表键”(这是不正确的技术用法),将“注册表数据”称为“注册表值”(也是不正确的技术用法),将“注册表键”称为文件夹/位置/“this放在注册表中”。

标签: powershellmatchingdword

解决方案


注册表提供者太可怕了。我只希望 get-itemproperty 像这样工作:

# get-itemproperty2.ps1

# get-childitem skips top level key, use get-item
# can't remove default name
param([parameter(ValueFromPipeline)]$key)

process { 
  $valuenames = $key.getvaluenames() 

  if ($valuenames) { 
    $valuenames | foreach {
      $value = $_
      [pscustomobject] @{
        Path = $key -replace 'HKEY_CURRENT_USER',
          'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
        Name = $Value
        Value = $Key.GetValue($Value)
        Type = $Key.GetValueKind($Value)
      }
    }
  } else {
    [pscustomobject] @{
      Path = $key -replace 'HKEY_CURRENT_USER',
        'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
        Name = ''
        Value = ''
        Type = ''
    }
  }
}

然后你可以做这样的事情:

PS C:\users\me> get-item hkcu:\key1 | get-itemproperty2

Path       Name  Value    Type
----       ----  -----    ----
HKCU:\key1 name1 value1 String
HKCU:\key1 name2 value2 String


PS C:\users\me> get-item hkcu:\key1 | get-itemproperty2 | where name -eq name1

Path       Name  Value    Type
----       ----  -----    ----
HKCU:\key1 name1 value1 String


PS C:\users\me> get-item hkcu:\key1 | get-itemproperty2 | where name -eq name1 | Remove-ItemProperty -whatif
What if: Performing the operation "Remove Property" on target "Item: HKEY_CURRENT_USER\key1 Property: name1".


PS C:\users\me> get-childitem -recurse hkcu:\key1 | get-itemproperty2

Path                      Name  Value     Type
----                      ----  -----     ----
HKCU:\key1\key2           name2 value2  String
HKCU:\key1\key2                 default String
HKCU:\key1\key2\key3      name3 value3  String
HKCU:\key1\key2\key3\key4

推荐阅读