簡體   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