(下一行是删除(默认)作为键名的答案),这是通过 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 参数中具有特殊含义的字符前面添加 `