从注册表项路径中提取根配置单元

Posted

技术标签:

【中文标题】从注册表项路径中提取根配置单元【英文标题】:Extract root hive from Registry key path 【发布时间】:2021-12-17 06:20:15 【问题描述】:

是否有等同于[System.IO.path]::GetPathRoot($path) 的注册表?我想在删除指定的键或属性后递归地删除空的父键,所以我想往回走,直到到达根配置单元。而且我不希望在抛出异常之前继续。

【问题讨论】:

有几种方法可以做到这一点。包括代码的相关部分。 我想我想知道的是,是否有一种单一的方法方法,就像示例一样,但用于注册表。我决定做的只是检查当前键是否有父键,如果有,则删除当前键并再次测试父键。所以if ($parent.PSParentPath) 是相关的条件。但是仍然很好奇是否有一种方法可以找到根密钥或根配置单元,或者我是否需要自己滚动。我的 Google-Fu 建议没有,微软从来没有打扰过。 【参考方案1】:

我不知道具体的功能。

如果您使用注册表提供程序,您还可以在子项上使用PSDrive 属性,这将为您提供有关注册表根的信息:

(Get-Item "HKLM:\Software\Windows").PSDrive.Name

(Get-Item "HKLM:\Software\Windows").PSDrive.Root

虽然对于“常规”注册表路径,它仍然很简单

$root = $path.Split("\")[0]

至于你的具体场景,你可以这样创建一个函数:

function Remove-KeyIfEmpty 
<#
.SYNOPSIS
Removes empty registry keys and optionally empty parent keys recursively.
#>
    [CmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(
            Mandatory,
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName
        )]
        [Alias("PSPath")]
        [string]$Path,
        [switch]$Recurse
    )
    $key = Get-Item $Path
    if ($key.Property.Count -eq 0 -and $key.SubKeyCount -eq 0) 
        if ($PSCmdlet.ShouldProcess($key, "Remove-Item")) 
            Remove-Item $Path
            if ($Recurse -and $key.PSParentPath) 
                Remove-KeyIfEmpty $key.PSParentPath -Recurse
            
        
    

例子:

Remove-KeyIfEmpty "HKCU:\Software\Example\SubKey" -Recurse

它甚至支持常用参数,例如-WhatIf-Confirm-Verbose-ErrorAction 开关。

【讨论】:

以上是关于从注册表项路径中提取根配置单元的主要内容,如果未能解决你的问题,请参考以下文章

从服务应用程序访问访客帐户系统注册表配置单元

在名称未知时从注册表项中提取特定数据 (USBSTOR)

神秘的本机“A”注册表项,路径为:Registry\A

如何配置 kubernetes 从托管在同一集群/内部的注册表中提取容器映像

怎么改配置文件?

如何修改配置文件