Powershell, registru a zástupné znaky, oh, můj

0

Otázka

Vzhledem...

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]

Mohu použít

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

která se vrátí KeyName, Key*Name a Key@Name, zatímco

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

vrátí se jen Key*Name. Tak daleko, tak dobrý. Můžu použít -cesta nebo -literalPath podle potřeby buď hledat klíč s zástupné znaky, nebo ne. Ale vlastnosti představovat problém.

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

funguje podle očekávání a výnosy Prop_1 a Prop_2 z KeyName klíč. A

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

funguje podle očekávání a vrací se jen Prop_[0-9] od stejného klíče. Ale to všechno se rozpadne, když potřebujete použít zástupný znak najít vlastnosti, na cestu, která obsahuje zástupný znak jako literál v klíčových cestě. Takže...

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

vrátí Prop_1 a Prop_2 ze všech tří klíčů. Není požadované chování.

Doufal jsem, že bude schopen filtrovat na PSPath pomocí -`literalPath ale tohle

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

nevrací správné vlastnosti. Zdá se, že -literalPath znamená doslovný název také. Tak jsem se snažil filtrování na PSPath a Name jako tak

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

Ale to nefunguje, protože jakmile jste skutečně dostat skutečné vlastnosti, které již nejsou .ČISTÝ typ, byly nasral do PSCustomObject. A to začíná být tak složité, zajímalo by mě, jestli existuje lepší způsob, jak postupovat. Musím poznamenat, že konečným cílem je dostat oba doslovný cestu a seznam doslovné názvy vlastností, tak to můžu přesunout, zkopírovat nebo odstranit vlastnosti. Takže, vzhledem k tomu, cesta Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name a jméno Prop_[0-9] Já to nakonec bude chtít, například, odstranit

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_1 

a

HKEY_LOCAL_MACHINE\SOFTWARE\Key*Name\Prop_2

ale ne

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

EDIT: na Základě odpovědi od @Tomalaka mám zjednodušené bit, aby se jednoduše dostat zpět seznam názvů vlastností. To vypadá jako tento

$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

Nejlepší odpověď

2

To bude klíč registru o doslovný cestu a filtrovat své vlastnosti podle regex match

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

Místo $key.Name můžete samozřejmě vrátit skutečné $key pokud je to pohodlnější pro váš úkol.

2021-11-16 10:57:44

Měl jsem jen podařilo dostat něco do práce, a to Get-Item -literalPath 'HKLM:\SOFTWARE\Key*Name\' | Select-Object -ExpandProperty property | Where {$_ -match "Prop_[0-9]"}. Teď mám více univerzální přístup. Čas na integraci. Pro kohokoliv, kteří chtějí, aby to fungovalo, -literalPath by měla být $keyPath ne $keya $keyPath je třeba začít s Registry:: nebo HKLM:.
Gordon

@Gordon máš pravdu, to byly omyly, když jsem překládal můj testovací kód. Opraveny.
Tomalak

Žádné starosti. Vlastně to bylo dost dobré pro mě třeba opravdu pochopit váš přístup, aby to fungovalo. Nejlepší způsob, jak se učit. :) Opravdu radost mít lepší přístup obecně pro nakládání s PSCustomObject jako návratový typ.
Gordon

@Gordon Tam je vždy více než jeden způsob, jak s PowerShell.
Tomalak

VELMI pravda, že. :)
Gordon

V jiných jazycích

Tato stránka je v jiných jazycích

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