2016-07-24 19 views
3

Folgende Funktionen tatsächlich tut den Trick:Powershell - Entfernen Sie alle Objekte in einem Registrierungselement

function Remove-AllItemProperties([String] $path) { 
    Get-ItemProperty $path | Get-Member -MemberType Properties | Foreach-Object { 
     if (("PSChildName","PSDrive","PSParentPath","PSPath","PSProvider") -notcontains $_.Name) { 
      Remove-itemproperty -path $path -Name $_.Name 
     } 
    } 
} 

Zum Beispiel: Um alle eingegebenen URLs aus der Registrierung löschen Sie

Remove-AllItemProperties("HKCU:\SOFTWARE\Microsoft\Internet Explorer\TypedURLs") 

Meine Probleme verwenden können sind:

  1. Da im zu Powershell relativ neu: ich frage mich, ob nicht ein schöneres (dh kompakt ist Lösung für das Problem.

  2. Die Funktion gibt einen Fehler aus, wenn das Element (Registrierungsschlüssel) keine Eigenschaften hat (Get-Member beschwert sich über ein fehlendes Objekt).

Vielen Dank für Ihre Ideen!

Antwort

3

Ich frage mich, ob es nicht eine schöne (dh kompakte Lösung für das Problem ist

ich einfach Remove-ItemProperty -Name * verwenden würde.

function Remove-AllItemProperties 
{ 
    [CmdletBinding()] 
    param([string]$Path) 

    Remove-ItemProperty -Name * @PSBoundParameters 
} 

Remove-ItemProperty -Name * entfernt alle vorhandenen Wert in dem Registrierungsschlüssel unter $Path

Das Attribut [CmdletBinding()] fügt automatisch Comm hinzu über Parameter (-Verbose, -Debug, -ErrorAction usw.) zu Ihrer Funktion.

Durch $PSBoundParameters an den inneren Ruf Splatting, erhalten Sie automatisch diese Optionen übergeben direkt an Remove-ItemProperty

Die Funktionen wirft einen Fehler, wenn der Artikel (Registrierungsschlüssel) keine Eigenschaften hat (Get-Member beschwert sich über ein fehlendes Objekt).

Der obige Ansatz wird das Problem nicht

+0

Dank Mathias! So kompakt und so elegant wie es nur geht. Danke auch für Ihre ausführliche Erklärung ... – coderookie