Dada...
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]
Eu posso usar
Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
que vai retornar KeyName
, Key*Name
e Key@Name
, enquanto
Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
irá retornar apenas Key*Name
. Tão longe, tão bom. Eu posso usar o caminho-ou -literalPath, conforme necessário, para procurar por uma chave com caracteres universais ou não. Mas as propriedades de representar um problema.
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
funciona como esperado e retorna Prop_1
& Prop_2
do KeyName
chave. E
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
funciona como esperado e retorna apenas Prop_[0-9]
da mesma chave. Mas tudo falhar além, quando você precisa usar um caractere curinga para localizar propriedades, em um caminho que inclui um caractere curinga como um literal no caminho da chave. Então...
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"
retorna Prop_1
& Prop_2
a partir de todas as três chaves. Não é o comportamento desejado em tudo.
Eu tinha a esperança de ser capaz de filtrar PSPath
utilizando -`literalPath', mas este
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}
não retorna as propriedades corretas. Parece que um -literalPath
significa um nome literal também. Então, eu tentei filtragem PSPath
e Name
como assim
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]"))}
Mas isso não funciona, porque quando você realmente começa a propriedades reais, eles não são mais um .Tipo de rede, eles foram shat em um PSCustomObject
.
E que está começando a ficar tão complicado, gostaria de saber se existe uma melhor maneira de proceder. Devo observar que o objetivo principal aqui é obter um caminho literal e uma lista de literais de nomes de propriedade, de modo que eu posso me mover, copiar ou excluir as propriedades. Assim, dado um caminho de Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name
e o nome de Prop_[0-9]
Eu, eventualmente, deseja, por exemplo, excluir
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1
&
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2
mas não
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]
EDIT: com Base na resposta do @Tomalak eu simplifiquei um pouco, simplesmente para obter uma lista de nomes de propriedade. Que se parece com isso
$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})
Get-Item -literalPath 'HKLM:\SOFTWARE\Key*Name\' | Select-Object -ExpandProperty property | Where {$_ -match "Prop_[0-9]"}
. Agora eu tenho um objectivo mais geral de abordagem. Tempo para se integrar. Para alguém querer fazer o trabalho,-literalPath
deve ser$keyPath
não$key
e$keyPath
precisa começar comRegistry::
ouHKLM:
.