PowerShell splatting合并到一个哈希表

时间:2016-03-31 09:54:46

标签: powershell hashtable

此代码执行我想要的操作:

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

this blog上我发现可能有更好/更清晰的方式在一个大哈希表中写这个。所以我尝试了以下内容:

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

$EventParams.Info

除了我不能在每个单个哈希表中的第一个示例$EventParams中获取变量而没有复制数据之外,这样做很好。有没有办法把它全部放在一个大的可持续的?

2 个答案:

答案 0 :(得分:1)

通常,您会将给定脚本中的所有或大部分事件写入公共日志和源。如果您想避免代码重复,可以使用脚本开头的$ PSDefaultParameters为脚本中写入的所有事件设置一次:

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

克隆它将在脚本中创建一个新副本,继承已在父或全局范围内设置的任何默认值,而不更改该范围中的哈希表。新的$ PSDefaultParameterValues将在脚本完成时处理,设置将恢复为父作用域中的任何内容。

如果您需要在脚本中的某个位置写入其他日志或源,可以通过指定该事件的LogName和Source来覆盖默认值。

答案 1 :(得分:0)

据我了解您的问题,您想在同一哈希表中引用LogNameSource?我怀疑这是可能的。

但是,你可以选择一个功能:

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

现在您可以使用例如:

获取所需的哈希表
Get-EventParams -LogName "Azure" -Source "Application" -Info

为方便起见,您还可以为ValidateSetLogName参数定义Soruce