繁体   English   中英

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

[英]Powershell - Remove (Default) registry key?

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

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删除(默认)注册表项的任何想法?

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

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

(以下行是删除(默认)作为密钥名称的答案),
这是通过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('')
}
  • SupportsShouldProcess - 允许-WhatIf参数
  • Param ...等 - 允许管道使用,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
当然,如果您不需要或不需要函数,只需从中获取这三行并在代码中使用它。
这是一篇很好的文章,它给了我这个想法。


在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参数中添加具有特殊含义的字符前面的`

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM