此代码执行我想要的操作:
$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
中获取变量而没有复制数据之外,这样做很好。有没有办法把它全部放在一个大的可持续的?
答案 0 :(得分:1)
通常,您会将给定脚本中的所有或大部分事件写入公共日志和源。如果您想避免代码重复,可以使用脚本开头的$ PSDefaultParameters为脚本中写入的所有事件设置一次:
#Set event loggin defaults
$PSDefaultParameterValues =
$PSDefaultParameterValues.Clone() + @{
'Write-Eventlog:LogName' = $LogName
'Write-Eventlog:Source' = $Source
}
克隆它将在脚本中创建一个新副本,继承已在父或全局范围内设置的任何默认值,而不更改该范围中的哈希表。新的$ PSDefaultParameterValues将在脚本完成时处理,设置将恢复为父作用域中的任何内容。
如果您需要在脚本中的某个位置写入其他日志或源,可以通过指定该事件的LogName和Source来覆盖默认值。
答案 1 :(得分:0)
据我了解您的问题,您想在同一哈希表中引用LogName
和Source
?我怀疑这是可能的。
但是,你可以选择一个功能:
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
为方便起见,您还可以为ValidateSet
和LogName
参数定义Soruce
。