Powershell, kayıt defteri ve joker karakterler, aman tanrım

0

Soru

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

En iyi cevabı

2

Bu, değişmez yola göre bir kayıt defteri anahtarı alacak ve özelliklerini regex eşleşmesine göre filtreleyecektir

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

Bunun yerine $key.Name elbette gerçek olanı iade edebilirsiniz $key eğer bu senin görevin için daha uygunsa.

2021-11-16 10:57:44

İşe yarayacak bir şey bulmayı başarmıştım, yani 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ı var Registry:: veya HKLM:.
Gordon

@ Gordon Haklısın, test kodumu çevirdiğimde bunlar yanlıştı. Sabit.
Tomalak

Endişeye gerek yok. İşe yaraması için yaklaşımınızı gerçekten anlamam benim için gerçekten çok iyiydi. Öğrenmenin en iyi yolu. :) Gerçekten mutlu için genel olarak daha iyi bir yaklaşım ile karşı karşıya PSCustomObject dönüş tipi olarak da.
Gordon

@ Gordon PowerShell ile her zaman birden fazla yol vardır.
Tomalak

ÇOK doğru, bu. :)
Gordon

Diğer dillerde

Bu sayfa diğer dillerde

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