从注册表项路径中提取根配置单元
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
开关。
【讨论】:
以上是关于从注册表项路径中提取根配置单元的主要内容,如果未能解决你的问题,请参考以下文章