Powershell, registro y comodines, oh mi

0

Pregunta

Dado a la...

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]

Puedo usar

Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"

que va a volver KeyName, Key*Name y Key@Name, mientras que

Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"

devuelve Key*Name. Tan lejos, tan bueno. Puedo usar la ruta o -literalPath como necesario buscar una clave con caracteres comodín o no. Pero las propiedades de suponer un problema.

Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"

funciona como se esperaba y devuelve Prop_1 & Prop_2 a partir de la KeyName clave. Y

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"

funciona como se espera y vuelve solo Prop_[0-9] de la misma clave. Pero todo falla, aparte cuando se necesita usar un comodín para encontrar las propiedades, en una ruta que incluya un carácter comodín como un literal en la ruta de la clave. Así que...

Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"

devuelve Prop_1 & Prop_2 de las tres llaves. No es el comportamiento deseado en absoluto.

Yo tenía la esperanza de ser capaz de filtrar en PSPath el uso de -`literalPath", pero esta

Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}

no devolver las propiedades correctas. Parece que un -literalPath significa un nombre literal también. Así que traté de filtrado en PSPath y Name así

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]"))}

Pero esto no funciona porque una vez que usted consigue realmente real de las propiedades, no son más de una .Tipo de RED, se han cagado en un PSCustomObject. Y que está empezando a llegar tan complicado me pregunto si hay una mejor manera de proceder. Debo señalar que el objetivo final aquí es para obtener una ruta literal y una lista de literales de la propiedad de los nombres, así que me puedo mover, copiar o borrar las propiedades. Así, dada una ruta de Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name y un nombre de Prop_[0-9] Yo, finalmente, quiere, por ejemplo, eliminar

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1 

&

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2

pero no

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]

EDIT: se Basa en la respuesta de @Tomalak he simplificado un poco, simplemente para obtener una lista de nombres de propiedad. Que se parece a esto

$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

Mejor respuesta

2

De esta manera se consigue una clave del registro literal de la ruta de acceso y el filtro de sus propiedades por regex partido

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

En lugar de la $key.Name por supuesto, usted puede devolver el real $key si es más conveniente para su tarea.

2021-11-16 10:57:44

Yo sólo había logrado conseguir algo de trabajo, a saber Get-Item -literalPath 'HKLM:\SOFTWARE\Key*Name\' | Select-Object -ExpandProperty property | Where {$_ -match "Prop_[0-9]"}. Ahora tengo una más general que se acercan. Tiempo para integrar. Para cualquier persona con ganas de hacer el trabajo, -literalPath debe ser $keyPath no $keyy $keyPath debe comenzar con Registry:: o HKLM:.
Gordon

@Gordon está a la derecha, quienes fueron descuidos cuando he traducido mi código de prueba. Fijo.
Tomalak

No se preocupe. En realidad, fue muy bueno para mí tiene que entender realmente su enfoque para hacer que funcione. La mejor manera de aprender. :) Muy feliz de tener un mejor enfoque en general para tratar con PSCustomObject como un tipo de retorno demasiado.
Gordon

@Gordon siempre Hay más de una manera con PowerShell.
Tomalak

MUY cierto, que. :)
Gordon

En otros idiomas

Esta página está en otros idiomas

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