Verilmiş...
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]
Kullanabilir miyim
Get-Item -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
hangisi geri dönecek KeyName
, Key*Name
ve Key@Name
, ise
Get-Item -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name"
sadece geri dönecek Key*Name
. Şimdiye kadar, çok iyi. Joker karakterli bir anahtar aramak için gerektiği gibi-path veya-literalPath kullanabilirim. Ancak özellikler bir sorun teşkil ediyor.
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
beklendiği gibi çalışır ve geri döner Prop_1
& Prop_2
şuradan KeyName
anahtar. Ve
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\KeyName" -name:"Prop_[0-9]"
beklendiği gibi çalışır ve sadece geri döner Prop_[0-9]
aynı anahtardan. Ancak, anahtar yolunda bir joker karakter içeren bir yoldaki özellikleri bulmak için bir joker karakter kullanmanız gerektiğinde hepsi başarısız olur. Böyle...
Get-ItemProperty -path:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]"
dönüşler Prop_1
& Prop_2
üç anahtardan da. Hiç de istenen davranış değil.
Filtreleyebilmeyi umuyordum. PSPath
kullanma - 'literalPath' ama bu
Get-ItemProperty -literalPath:"Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name" -name:"Prop_[0-9]" | where {$_.PSPath -match [RegEx]::Escape("Key*Name")}
doğru özellikleri döndürmez. Öyle görünüyor ki bir -literalPath
edebi bir adı da demektir. Bu yüzden filtrelemeyi denedim PSPath
ve Name
öyle gibi
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]"))}
Ancak bu işe yaramıyor çünkü bir kez gerçek mülkleri aldığınızda, artık bir. NET türü değiller, bir PSCustomObject
.
Ve bu o kadar karmaşıklaşmaya başladı ki, devam etmenin daha iyi bir yolu olup olmadığını merak ediyorum. Buradaki nihai hedefin, özellikleri taşıyabilmem, kopyalayabilmem veya silebilmem için hem değişmez bir yol hem de değişmez özellik adlarının bir listesini almak olduğuna dikkat etmeliyim. Yani, bir yol verildi Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name
ve bir isim Prop_[0-9]
Sonunda, örneğin silmek isteyeceğim
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1
&
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2
ama
HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_[0-9]
DÜZENLEME: @Tomalak'ın cevabına dayanarak, özellik adlarının bir listesini geri almak için biraz basitleştirdim. Bu gibi görünüyor
$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]"}
. Şimdi daha genel amaçlı bir yaklaşımım var. Bütünleşmenin zamanı geldi. Bunu yapmak isteyen herkes için,-literalPath
olmalı$keyPath
değil$key
, ve$keyPath
başlangıç için ihtiyacı varRegistry::
veyaHKLM:
.