2016-03-31 4 views
1

Verschmelzung tut, was ich will es tun:Powershell splatting Diesen Code zu einem Hash-Tabelle

$EventParams = @{ 
    LogName = $LogName 
    Source = $Source 
} 
$EventInfoParams = $EventParams + @{ 
    EntryType = 'Information' 
    EventID = '0' 
} 
$EventWarnParams = $EventParams + @{ 
    EntryType = 'Warning' 
    EventID = '1' 
} 
$EventErrorParams = $EventParams + @{ 
    EntryType = 'Error' 
    EventID = '2' 
} 

Auf this blog fand ich heraus, es gibt vielleicht schönere/sauberere Möglichkeiten, dies in einer großen Hash-Tabelle zu schreiben. Also habe ich versucht, die folgende:

$EventParams = @{ 
    LogName = $LogName 
    Source = $Source 
    Info = @{ 
     EntryType = 'Information' 
     EventID = '0' 
    } 
    Warn = @{ 
     EntryType = 'Warning' 
     EventID = '1' 
    } 
    Error = @{ 
     EntryType = 'Error' 
     EventID = '2' 
    } 
} 

$EventParams.Info 

Dies funktioniert gut auf, außer dass ich nicht die Variablen aus im ersten Beispiel $EventParams in jedem der einzelnen Hash-Tabellen ohne Duplizierung Daten erhalten kann. Gibt es einen Weg, um alles in einem großen, hastablen zu haben?

Antwort

1

Normalerweise würden Sie alle oder die meisten Ereignisse von einem bestimmten Skript in ein gemeinsames Protokoll und eine Quelle schreiben. Wenn Sie wollen Code-Duplizierung zu vermeiden, können Sie diese Einstellung einmal für alle Ereignisse, die aus dem Skript geschrieben werden $ PSDefaultParameters am Anfang des Skripts:

#Set event loggin defaults 
$PSDefaultParameterValues = 
$PSDefaultParameterValues.Clone() + @{ 
    'Write-Eventlog:LogName' = $LogName 
    'Write-Eventlog:Source' = $Source 
    } 

Klonen es eine neue Kopie erstellen wird in Das Skript erbt alle Standardwerte, die bereits im übergeordneten oder globalen Bereich festgelegt sind, ohne die Hashtabelle in diesem Bereich zu ändern. Die neuen $ PSDefaultParameterValues ​​werden nach Abschluss des Skripts entfernt, und die Einstellungen werden wieder auf den Wert im übergeordneten Bereich zurückgesetzt.

Wenn Sie in ein anderes Protokoll oder eine Quelle irgendwo im Skript schreiben müssen, können Sie dies tun, indem Sie LogName und Source für dieses Ereignis angeben und die Standardwerte überschreiben.

0

Soweit ich Ihre Frage verstehe, möchten Sie LogName und Source innerhalb der gleichen Hashtabelle referenzieren? Ich bezweifle, dass dies möglich ist.

Sie können jedoch mit einer Funktion gehen:

function Get-EventParams 
{ 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true,Position=0)] 
     [string]$LogName, 

     [Parameter(Mandatory=$true,Position=1)] 
     [string]$Source, 

     [Parameter(Mandatory=$true,Position=2, ParameterSetName='info')] 
     [switch]$Info, 

     [Parameter(Mandatory=$true,Position=2, ParameterSetName='warn')] 
     [switch]$Warn, 

     [Parameter(Mandatory=$true,Position=2, ParameterSetName='error')] 
     [switch]$Error 

    ) 
     @{ 
      LogName = $LogName 
      Source = $Source 
     } 

     if ($Info) 
     { 
      @{ 
       EntryType = 'Information' 
       EventID = '0' 
      } 
     } 
     if ($Warn) 
     { 
      @{ 
       EntryType = 'Warning' 
       EventID = '1' 
      } 
     } 

     if ($Error) 
     { 
      @{ 
       EntryType = 'Error' 
       EventID = '2' 
      } 
     } 
} 

Jetzt können Sie die gewünschte Hash-Tabelle zum Beispiel unter Verwendung erhalten:

Get-EventParams -LogName "Azure" -Source "Application" -Info 

Der Einfachheit halber können Sie auch eine ValidateSet für Ihre LogName definieren und Soruce Parameter.

+0

Ich wollte tatsächlich alles in einer Hashtabelle haben. Kein Glück, denke ich .. Eine Funktion ist ein bisschen zu viel für mich, aber trotzdem danke. – DarkLite1

+0

Ja, eine Funktion kann hier ein Overkill sein. Vielleicht hat jemand anderes eine andere Idee. Viel Glück. –