以下是删除注册表键名中的 (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参数中具有特殊含义的字符前添加`