Powershell, registro e curingas, oh meu

0

Pergunta

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})
powershell registry wildcard
2021-11-16 08:27:28
1

Melhor resposta

2

Isto irá obter uma chave do registro pelo caminho literal e filtrar suas propriedades por regex correspondência

$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
        }
    }
}

Em vez de o $key.Name é claro que você pode voltar a real $key se que é mais conveniente para a sua tarefa.

2021-11-16 10:57:44

Eu tinha apenas conseguiu algo para trabalhar, nomeadamente 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 $keye $keyPath precisa começar com Registry:: ou HKLM:.
Gordon

@Gordon Você está certo, aqueles que foram descuidos quando eu traduzi o meu teste de código. Fixo.
Tomalak

Não se preocupe. Ele foi realmente muito boa, para mim a necessidade de compreender realmente a sua abordagem para fazê-lo funcionar. A melhor maneira de aprender. :) Muito feliz de ter uma melhor abordagem, em geral, para lidar com PSCustomObject como um tipo de retorno também.
Gordon

@Gordon Há sempre mais de um caminho com o PowerShell.
Tomalak

MUITO verdadeiro, que. :)
Gordon

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................