Powershell - 删除(默认)注册表项?

时间:2012-10-12 12:19:08

标签: powershell registry

我看到你可以通过运行来删除项目:

Remove-Item -Path hkcu:\CurrentVersion

但我试过

Remove-Item -Path 'Registry::HKEY_CURRENT_USER\Software\Testing\(Default)'

但那没用。我也试过

Remove-Item -Path 'Registry::HKEY_CURRENT_USER\Software\Testing\' -name '(Default)'

哪个也行不通。有关如何通过PowerShell删除(默认)注册表项的任何想法吗?

3 个答案:

答案 0 :(得分:4)

您是否尝试从注册表.msc控制台中删除它?

我认为无法删除密钥的默认值。

答案 1 :(得分:0)

(以下行是将(默认)作为键名删除的答案),
这是通过PowerShell从注册表项中删除默认值:(默认)的答案。

自从v1以来,它被认为是PS中的一个错误。从2018年开始,随着v5.1,bug仍然存在 实际上Remove-Item -Path 'Registry::HKEY_CURRENT_USER\Software\Testing\' -name '(Default)'是错误的,因为(默认)不是Key,而是属性,
但是,让我们大多数人尝试过:
Remove-ItemProperty -Path Registry::HKEY_CURRENT_USER\Software\Testing -Name '(Default)'
这应该有效。

幸运的是,与许多PS Cmdlet一样, Remove-ItemProperty 的功能可以通过使用Method来代替。在这种情况下,在RegistryKey对象上调用DeleteValue()方法 由Get-Item获得的一个小打嗝作为Key是只读的。但是另一个方法,OpenSubKey()可以用来获得对Key的可写访问。

function Remove-ItemPropertyDefault {
  [CmdletBinding(SupportsShouldProcess=$true)]
  Param (
    [parameter(ParameterSetName='Path', Mandatory=$true, Position=0)]
    [String]$Path,
    [parameter(ParameterSetName='Key', Mandatory=$true, ValueFromPipeline=$true)]
    [Microsoft.Win32.RegistryKey]$Key
  )
    if ($Path) {$Key = Get-Item -LiteralPath $Path}
    $ParentKey = Get-Item -LiteralPath $Key.PSParentPath
    $KeyName = $Key.PSChildName
    ($ParentKey.OpenSubKey($KeyName, $True)).DeleteValue('')
}
  • 支持应该处理 - 允许 -WhatIf 参数
  • Param ... etc - 允许管道使用,String和RegistryKey输入以及完整性检查
  • $ ParentKey - 获取使用方法在可写模式下打开原始密钥的父密钥
  • $ KeyName - 没有路径的原始密钥名称的字符串值
  • OpenSubKey() - 将获得一个Key Key of Key,也提供第二个参数来选择写访问权
  • 使用空字符串作为参数的DeleteValue()。在RegistryKey对象的方法内部,(默认)值由空字符串引用。

使用:
Remove-ItemPropertyDefault Registry::HKEY_CURRENT_USER\Software\Testing

Get-Item Registry::HKEY_CURRENT_USER\Software\Testing | Remove-ItemPropertyDefault

$k = Get-Item Registry::HKEY_CURRENT_USER\Software\Testing Remove-ItemPropertyDefault -Key $k
当然,如果您不需要或想要一个功能,只需从中获取这三行并在您的代码中使用它。
这是一个不错的article which gave me this idea.

OP可能会询问如何删除名称为(默认), 不是密钥的默认值,因为登陆这里的人主要搜索。 在这种情况下,应使用-LiteralPath,因为在-Path参数中将括号视为特殊字符,而-LiteralPath则使用其字面含义:

Remove-Item -LiteralPath 'Registry::HKEY_CURRENT_USER\Software\Testing\(Default)'

或括号需要转义:

Remove-Item -Path "Registry::HKEY_CURRENT_USER\Software\Testing\`(Default`)"

(*)单引号无法使用,但必须使用双引号或无引号才能使转义字符起作用。

或者最后,如果Path不是文字的,可以使用函数来转义字符串,在编写代码时不知道:

Remove-Item -Path ([Management.Automation.WildcardPattern]::Escape('Registry::HKEY_CURRENT_USER\Software\Testing\(Default)'))

(*)这将在Path参数

中添加具有特殊含义的字符前面的`

答案 2 :(得分:0)

以@papo的答案为准-如果OP希望清除(清空)(Default)注册表值的内容,并使用在PowerShell中访问注册表的标准方式,则将使用oneliner

$(Get-Item -Path "HKCU:\Software\Testing").OpenSubKey("", $true).DeleteValue("")
  • Get-Item -Path获取 RegistryKey 对象以进行读取
  • OpenSubKey("", $true)重新打开具有写权限的相同密钥
  • DeleteValue("")清除默认值(在.NET中被视为未命名)