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})
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$key
y$keyPath
debe comenzar conRegistry::
oHKLM:
.