Фон
Я создал функцию-оболочку вокруг Write-EventLog
, чтобы я мог легко вызывать ее, не беспокоясь о проверке и создании журнала/источника событий каждый раз. Просто добавляя параметр -Force
, я хочу, чтобы он создавал журнал, если он не существует; если я не добавлю этот параметр, он должен вести себя как обычно (что снижает накладные расходы на несколько проверок, если они вызываются из кода, где я знаю, что этот журнал будет существовать).
Я скопировал список параметров, доступных для write-eventlog
, чтобы у меня была полная функциональность, доступная для моей оболочки. Однако; если я не указываю значения некоторым из этих параметров (например, RawData), они по умолчанию равны нулю; затем я пытаюсь передать значение null для этого параметра; что отличается от того, чтобы не поставлять его. Я не хочу перечислять каждую возможную итерацию комбинаций параметров с проверкой того, были ли эти значения предоставлены перед вызовом соответствующей сигнатуры метода.
Вопрос
Есть ли способ передавать значения параметрам write-eventlog
только там, где эти параметры были переданы write-eventlog2
?
Код
cls
$myLog = 'Application'
$mySource = 'My PS Script'
$myEventId = 1
[System.Diagnostics.EventLogEntryType]$myEntryType = [System.Diagnostics.EventLogEntryType]::Error
$myMessage = 'This is a test message'
function Write-EventLog2
{
[cmdletbinding()]
param(
[Parameter(Position=0,Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[String]$LogName
,
[Parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[String]$Source
,
[Parameter(Position=3,Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[Int32]$EventId
,
[Parameter(Position=4,Mandatory=$false,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[System.Diagnostics.EventLogEntryType]$EntryType = [System.Diagnostics.EventLogEntryType]::Information
,
[Parameter(Position=5,Mandatory=$false,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[String]$Message
,
[Parameter(Position=6,Mandatory=$false,ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)]
[Int16]$Category = 1
,
[Parameter(Position=7,Mandatory=$false,ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)]
[String]$ComputerName = $env:COMPUTERNAME
,
[Parameter(Position=8,Mandatory=$false,ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)]
[Byte[]]$RawData
,
[Parameter(Position=9,Mandatory=$false,ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true)]
[switch]$Force
)
begin
{
if($Force.IsPresent)
{
if (! ([System.Diagnostics.EventLog]::Exists($LogName) -and [System.Diagnostics.EventLog]::SourceExists($Source) ))
{
New-EventLog -LogName $LogName -Source $Source
}
}
}
process {
Write-EventLog -LogName $LogName -Source $Source -EventId $EventId -EntryType $EntryType -Message $Message -Category $Category -ComputerName $ComputerName -RawData $RawData
}
#end{} #no ending actions required
}
Write-EventLog2 $myLog $mySource $myEventId $myEntryType $myMessage -Force
Ошибка
Write-EventLog : Cannot validate argument on parameter 'RawData'.
The argument is null or empty. Provide an argument that is not
null or empty, and then try the command again.
At line:51 char:167