Public/Write-ATMDEventLog.ps1

function Write-ATMDEventLog {
    <#
    .SYNOPSIS
        Создает запись в журнале событий Windows.
    .DESCRIPTION
        Использую объект класса System.Diagnostics.EventInstance функиця создает запись в журнале событий Windows.
    .PARAMETER EventLogName
        Определяет имя журнала событий Windows, в который будет производится запись.
        По-умолчанию имеет значение "ATMD Event Log"
    .PARAMETER EventLogSource
        Опредеяет источник сообщения в журнале событий.
        По-умолчанию имеет значение "PSScript"
    .PARAMETER CategoryId
        Определяет значение в столбце "Каьегория задачи" в журнале событий.
    .PARAMETER InstanceId
        Определяет код события для записи в журнале событий.
    .PARAMETER EntryType
        Определяет тип записив журнале Windows.
        Допустимые значения: 'Error','FailureAudit','Information','SuccessAudit','Warning'.
    .PARAMETER MessageParams
        Набор подстановочных параметров для формирования сообения в журнале событий.
        Данные используются для замены шаблонов пдстановки (%1, %2 и т.д.) в тексте на кокретные значения.
    .EXAMPLE
        PS C:\> Write-ATMDEventLog -CategoryId 2 -InstanceId 1000 -EntryType 'Information' -MessageParams 'ATMD\username'
        Для более полного понимания параметров следуюет ознакомиться в ресурсами библиотеки ATMDEventLogMessages.dll
    .INPUTS
        При вызове функции обязательно указывать код события, тип события и категорию.
    .NOTES
        Функция записывает данные в локальный журнал событий, то есть на том узле, где выполняется.
        Сответственно, функция не может быть использована на машинах с Linux.
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [System.String]
        $EventLogName = 'ATMD Event Log',

        [Parameter(Mandatory = $false, Position = 1)]
        [System.String]
        $EventLogSource = 'PSScript',

        [Parameter(Mandatory = $true, Position = 2)]
        [System.Int32]
        $CategoryId,

        [Parameter(Mandatory = $true, Position = 3)]
        [System.Int64]
        $InstanceId,

        [Parameter(Mandatory = $true, Position = 4)]
        [ValidateSet('Error', 'FailureAudit', 'Information', 'SuccessAudit', 'Warning')]
        [System.String]
        $EntryType,

        [Parameter(Mandatory = $false, Position = 5)]
        [System.Object]
        $MessageParams
    )

    begin {

    }

    process {
        try {
            if ($IsLinux) {
                throw [System.Configuration.ConfigurationException]::New('This operation system does not supported.')
            }
            $EventLog = New-Object System.Diagnostics.Eventlog($EventLogName)
            $EventLog.Source = $EventLogSource
            switch ($EntryType) {
                'Error' {
                    $EventType = [System.Diagnostics.EventLogEntryType]::Error
                }
                'FailureAudit' {
                    $EventType = [System.Diagnostics.EventLogEntryType]::FailureAudit
                }
                'Information' {
                    $EventType = [System.Diagnostics.EventLogEntryType]::Information
                }
                'SuccessAudit' {
                    $EventType = [System.Diagnostics.EventLogEntryType]::SuccessAudit
                }
                'Warning' {
                    $EventType = [System.Diagnostics.EventLogEntryType]::Warning
                }
                Default {
                    $EventType = [System.Diagnostics.EventLogEntryType]::Information
                }
            }
            $EventInstance = New-Object System.Diagnostics.EventInstance($InstanceId, $CategoryId, $EventType)
            $EventLog.WriteEvent($EventInstance, $MessageParams)
        }
        catch {
            #$PSCmdlet.ThrowTerminatingError($PSItem)
            Write-Error -Exception $PSItem.Exeception
        }
    }

    end {

    }
}