6

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

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删除(默认)注册表项吗?

4

3 回答 3

4

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

我认为不可能删除键的默认值。

于 2012-10-12T12:31:50.203 回答
1

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

从 v1.1 开始,这应该是 PS 中的一个错误。现在截至 2018 年,使用 v5.1,错误仍然存​​在。
实际上Remove-Item -Path 'Registry::HKEY_CURRENT_USER\Software\Testing\' -name '(Default)'是错误的,因为 (Default) 不是键,而是属性,
但是假设我们大多数人都尝试过:
Remove-ItemProperty -Path Registry::HKEY_CURRENT_USER\Software\Testing -Name '(Default)'
这应该有效。

幸运的是,与许多 PS Cmdlet 一样,Remove-ItemProperty的功能可以通过使用方法来替代。在这种情况下 DeleteValue() 在 RegistryKey 对象上调用方法。
有一个小问题,作为一个Key,Get-Item 获得的是Read-only。但是另一种方法 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 ... 等 - 允许使用管道,包括 String 和 RegistryKey 输入以及完整性检查
  • $ParentKey - 获取用于以可写模式打开原始密钥的方法的父密钥
  • $KeyName - 没有路径的原始键名的字符串值
  • OpenSubKey() - 将获得一个 Key 的子 Key,还提供第二个参数来选择写入权限
  • 以空字符串作为参数的 DeleteValue()。在 RegistryKey 对象的方法中,(默认)值由空字符串引用。

Use:
Remove-ItemPropertyDefault Registry::HKEY_CURRENT_USER\Software\Testing
or
Get-Item Registry::HKEY_CURRENT_USER\Software\Testing | Remove-ItemPropertyDefault
or
$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`)"

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

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

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

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

于 2018-05-22T07:49:28.590 回答
1

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

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