Подтвердить что ты не робот

Как определить, существует ли EventLog уже

Я использую следующую строку для создания нового журнала событий

new-eventlog -LogName "Visual Studio Builds" -Source "Visual Studio"

Я хочу запускать это каждый раз, потому что, если я запустил сборку с нового компьютера, мне все равно хотелось бы видеть журналы событий.

Проблема в том, что каждый раз, когда script запускается после того, как журнал уже создан, он выдает ошибку.

New-EventLog : The "Visual Studio" source is already registered on the "localhost" computer.
At E:\Projects\MyApp\bootstrap.ps1:14 char:13
+ new-eventlog <<<<  -LogName "Visual Studio Builds" -Source "Visual Studio"
    + CategoryInfo          : InvalidOperation: (:) [New-EventLog], InvalidOperationException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.NewEventLogCommand

Теперь я знаю, что могу "искать" журнал событий

Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"} 

Но как определить, существует ли он?

4b9b3361

Ответ 1

Итак, я был на правильном пути с Get-EventLog.

Вместо того, чтобы просто читать его, я сохранил его в переменной. Затем я проверил, была ли переменная null.

Это достигло того, что я хотел сделать.

$logFileExists = Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"} 
if (! $logFileExists) {
    New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}

Ответ 2

# Check if Log exists
# Ref: http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.exists(v=vs.110).aspx
[System.Diagnostics.EventLog]::Exists('Application');


# Ref: http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.sourceexists(v=vs.110).aspx
# Check if Source exists
[System.Diagnostics.EventLog]::SourceExists("YourLogSource");

Ответ 3

Проверьте метод Exists:

[System.Diagnostics.EventLog]::Exists('Visual Studio Builds')

Ответ 4

if ([System.Diagnostics.EventLog]::SourceExists("Visual Studio") -eq $False) { New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio" }

Ответ 5

Чтобы просто проверить, существует ли:

$EventLogName = "LogName"
if ( !($(Get-EventLog -List).Log.Contains($EventLogName)))
{}

Но для создания нового вам понадобится привилегия "Как администратора". Чтобы решить эту проблему, я использовал подпроцесс:

Start-Process -verb runAs powershell.exe  -ArgumentList "-file $PSScriptRoot\CreateLog.ps1" -wait

С простым CreateLog.ps1:

New-EventLog -LogName ScriptCheck -Source ScriptCheck
Write-EventLog –LogName ScriptCheck `
–Source ScriptCheck –EntryType Information –EventID 100 `
–Message "Start logging!"

Ответ 6

Я думаю, что ниже подход может уменьшить нагрузку на фильтр с помощью where

    try
    {
        Get-EventLog -LogName "Visual Studio Builds" -ErrorAction Ignore| Out-Null
    }
    catch {
        New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
    }

Ответ 7

Менее сложный:

 if (!(Get-Eventlog -LogName "Application" -Source "YourLog")){
      New-Eventlog -LogName "Application" -Source "YourLog"
 }