PowerShell - 如何删除默认的注册表键?

7

我看到您可以通过运行以下命令删除项目:

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删除(Default)注册表键吗?

3个回答

4

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

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


4
正确,您不能删除“(默认)”值而不删除键本身。 - Ansgar Wiechers
2
我不知道这是否曾经是真的,但在Windows 10中,您绝对可以删除regedit.exe中的默认值。 - Steve

2

在 @papo 的回答基础上进行迭代 - 如果 OP 希望清除(使其为空)(Default) 注册表值的内容,并使用 PowerShell 中访问注册表的标准方式,一行代码就可以实现。

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

这是最好的答案。 - Jimmy He

1

以下是删除注册表键名中的 (Default) 的答案:
这是通过 PowerShell 从注册表键中删除默认值 (Default) 的答案。

这似乎是自 v1 以来 PS 中的一个 bug。现在到了 2018 年,使用 v5.1,该 bug 仍然存在。
实际上,Remove-Item -Path 'Registry::HKEY_CURRENT_USER\Software\Testing\' -name '(Default)' 是错误的,因为 (Default) 不是一个键,而是一个属性,
但是让我们说大多数人都尝试过:
Remove-ItemProperty -Path Registry::HKEY_CURRENT_USER\Software\Testing -Name '(Default)'
这应该可以工作。

幸运的是,与许多 PS Cmdlets 一样,Remove-ItemProperty 的功能可以被替换为使用方法。在这种情况下,调用 RegistryKey 对象上的 DeleteValue() 方法。
有一个小问题,由 Get-Item 获取的键是只读的。但是,另一个方法 OpenSubKey() 可以用于获取对键的可写访问权限。

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('')
}
  • SupportsShouldProcess - 允许使用-WhatIf参数
  • Param ...等 - 允许使用管道,包括字符串和注册表键输入,并进行健全性检查
  • $ParentKey - 获取在其上使用方法以以可写模式打开原始键的父键
  • $KeyName - 原始键名称的字符串值,不包括路径
  • OpenSubKey() - 将获取键的子键,还提供第二个参数以选择写入访问权限
  • 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
当然,如果您不需要或不想要函数,只需从中提取这三行并在代码中使用即可。
这是一篇不错的文章,给了我这个想法。
OP可能是询问如何删除名称为"(Default)"的,而不是从键中删除默认值,因为大部分来到这里的人都是搜索这个问题。 在这种情况下,应该使用-LiteralPath,因为括号被视为-Path参数中的特殊字符,而-LiteralPath会按字面意义处理它们:
Remove-Item -LiteralPath 'Registry::HKEY_CURRENT_USER\Software\Testing\(Default)'

或者括号需要转义:
Remove-Item -Path "Registry::HKEY_CURRENT_USER\Software\Testing\`(Default`)"

(*) 在这种情况下不能使用单引号,而必须使用双引号或不使用引号才能使转义字符起作用。

最后,如果路径不是字面量,可以使用一个函数来转义字符串,在编写代码时未知:

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

(*) 这将在Path参数中具有特殊含义的字符前添加`


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接