powershell - Powershell、注册表和通配符,哦,我的
问题描述
鉴于...
HKLM\Software\
KeyName
Property_1
Property_2
Property_[0-1]
Key*Name
Property_1
Property_2
Property_[0-1]
Key@Name
Property_1
Property_2
Property_[0-1]
我可以用
Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
这将返回KeyName
,Key*Name
和Key@Name
, 而
Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
将返回只是Key*Name
。到现在为止还挺好。我可以根据需要使用 -path 或 -literalPath 来搜索带有通配符的键。但是属性会带来问题。
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
按预期工作并从密钥返回Prop_1
& 。和Prop_2
KeyName
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
按预期工作并仅从Prop_[0-9]
同一个键返回。但是,当您需要使用通配符在包含通配符作为键路径中的文字的路径中查找属性时,一切都会失败。所以...
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"
从所有三个键返回Prop_1
& 。Prop_2
根本不是想要的行为。
我曾希望能够PSPath
使用 -`literalPath' 进行过滤,但这
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}
不返回正确的属性。似乎 a-literalPath
也意味着字面名称。所以我试着过滤PSPath
,Name
就像这样
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {(($_.PSPath -match [RegEx]::Escape("Key*Name")) -and ($_.Name -match "Prop_[0-9]"))}
但这不起作用,因为一旦您真正获得了真正的属性,它们就不再是 .NET 类型,它们已被转换为PSCustomObject
. 这开始变得如此复杂,我想知道是否有更好的方法来进行。我应该注意,这里的最终目标是获取文字路径和文字属性名称列表,以便我可以移动、复制或删除属性。因此,给定路径Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name
和名称,Prop_[0-9]
我最终会想要,例如,删除
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1
&
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2
但不是
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]
编辑:根据@Tomalak 的回答,我进行了一些简化,以简单地获取属性名称列表。看起来像这样
$keyPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
$propExpr = "Prop_[0-9]"
((Get-Item -literalPath:$keyPath | Get-ItemProperty).PSObject.Properties | Where-Object Name -Match $propExpr | ForEach-Object {$_.Name})
解决方案
这将通过文字路径获取注册表项并通过正则表达式匹配过滤其属性
$keyPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
$propExpr = "Prop_[0-9]"
Get-Item -literalPath $keyPath -PipelineVariable key | Get-ItemProperty | ForEach-Object {
$_.PSObject.Properties | Where-Object Name -Match $propExpr | ForEach-Object {
[pscustomobject]@{
key = $key.Name
prop = $_.Name
value = $_.Value
}
}
}
如果这对您的任务更方便,您$key.Name
当然可以返回实际值,而不是。$key
推荐阅读
- php - 如何使用带有 API Key 和 API Secret 的 PHP 查询 OData API?获取“未设置 URL!” 卷曲错误
- google-cloud-datalab - Google Cloud Datalab - 创建您自己的 Python 环境
- android - 如果 Intent 设置为 Type,为什么我不能成功地向接收者发送广播?
- java - 无法在 Windows 上的 bash 上访问 jarfile
- angular - 单击另一个组件时组件的Angular 6输出信息
- c++ - 如何对可以是数字或单词的输入进行编程(C++)
- typescript - 如何在 Typescript 中引用工厂创建的类的实例?找不到名称错误
- javascript - JavaScript 登录功能无法使用 WebSQL
- java - org.springframework.beans.factory.BeanCreationException:创建名为“statViewServlet”的bean时出错
- python - Azure Python Flask 上的 Tika 抛出错误 500